【深入学习Vue丨第二篇】构建动态Web应用的基础

前言

Vue模板语法是一种基于HTML的扩展语法,它允许开发者声明式地将数据绑定到DOM。与传统的字符串模板或JSX不同,Vue模板更接近原生HTML,学习曲线平缓,同时提供了强大的数据绑定和逻辑控制能力。

模板语法基础

文本插值

最基本的模板语法是"Mustache"语法(双大括号),用于数据绑定:

html 复制代码
<div id="app">
  <p>{{ message }}</p>
  <!-- 一次性插值 -->
  <span v-once>{{ message }}</span>
</div>
javascript 复制代码
new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})

2. 原始HTML

双大括号会将数据解释为普通文本,如果要输出真正的HTML,需要使用v-html指令:

html 复制代码
<div id="app">
  <p>{{ rawHtml }}</p>
  <!-- 输出真正的HTML -->
  <p v-html="rawHtml"></p>
</div>
typescript 复制代码
new Vue({
  el: '#app',
  data: {
    rawHtml: '<span style="color: red">红色文字</span>'
  }
})

指令详解

指令是带有v-前缀的特殊属性,其值预期是单个JavaScript表达式

1. 条件渲染

html 复制代码
<div id="app">
  <!-- v-if 条件渲染 -->
  <p v-if="isVisible">你可以看到我</p>
  <p v-else>你看不到上面的内容</p>
  
  <!-- v-show 条件显示 -->
  <p v-show="isShow">我总是被渲染,只是可能不显示</p>
  
  <!-- 多个条件判断 -->
  <div>
    <p v-if="type === 'A'">类型A</p>
    <p v-else-if="type === 'B'">类型B</p>
    <p v-else>其他类型</p>
  </div>
</div>
javascript 复制代码
new Vue({
  el: '#app',
  data: {
    isVisible: true,
    isShow: false,
    type: 'A'
  }
})

v-if vs v-show:

  • v-if是真正的条件渲染,元素会被销毁和重建

  • v-show只是切换CSS的display属性

  • if有更高的切换开销,v-show有更高的初始渲染开销

2. 列表渲染

使用v-for指令基于数组或对象渲染列表:

html 复制代码
<div id="app">
  <!-- 数组渲染 -->
  <ul>
    <li v-for="(item, index) in items" :key="item.id">
      {{ index + 1 }}. {{ item.name }}
    </li>
  </ul>
  
  <!-- 对象渲染 -->
  <ul>
    <li v-for="(value, key, index) in userInfo">
      {{ index + 1 }}. {{ key }}: {{ value }}
    </li>
  </ul>
  
  <!-- 使用计算属性过滤列表 -->
  <ul>
    <li v-for="item in filteredItems" :key="item.id">
      {{ item.name }}
    </li>
  </ul>
</div>

3.事件处理

使用v-on指令(简写@)监听DOM事件:

html 复制代码
<div id="app">
  <!-- 直接执行方法 -->
  <button @click="sayHello">点击我</button>
  
  <!-- 内联JavaScript语句 -->
  <button @click="count++">计数: {{ count }}</button>
  
  <!-- 传递参数 -->
  <button @click="saySomething('Hello!')">打招呼</button>
  
  <!-- 访问原始DOM事件 -->
  <button @click="warn('表单不能提交', $event)">
    提交
  </button>
  
  <!-- 事件修饰符 -->
  <form @submit.prevent="onSubmit">
    <input type="text">
    <button type="submit">提交</button>
  </form>
  
  <!-- 按键修饰符 -->
  <input @keyup.enter="submitForm" placeholder="按回车提交">
</div>
html 复制代码
new Vue({
  el: '#app',
  data: {
    count: 0
  },
  methods: {
    sayHello() {
      alert('Hello!')
    },
    saySomething(message) {
      alert(message)
    },
    warn(message, event) {
      if (event) {
        event.preventDefault()
      }
      alert(message)
    },
    onSubmit() {
      alert('表单已提交')
    },
    submitForm() {
      alert('表单通过回车提交')
    }
  }
})

4. 表单输入绑定

使用v-model指令在表单元素上创建双向数据绑定:

html 复制代码
<div id="app">
  <!-- 文本输入 -->
  <input v-model="message" placeholder="编辑我">
  <p>输入的内容: {{ message }}</p>
  
  <!-- 多行文本 -->
  <textarea v-model="multilineText"></textarea>
  <p style="white-space: pre-line">{{ multilineText }}</p>
  
  <!-- 复选框 -->
  <input type="checkbox" id="checkbox" v-model="checked">
  <label for="checkbox">{{ checked }}</label>
  
  <!-- 多个复选框 -->
  <div>
    <input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
    <label for="jack">Jack</label>
    <input type="checkbox" id="john" value="John" v-model="checkedNames">
    <label for="john">John</label>
    <input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
    <label for="mike">Mike</label>
    <p>选中的人: {{ checkedNames }}</p>
  </div>
  
  <!-- 单选按钮 -->
  <div>
    <input type="radio" id="one" value="One" v-model="picked">
    <label for="one">One</label>
    <input type="radio" id="two" value="Two" v-model="picked">
    <label for="two">Two</label>
    <p>选中的值: {{ picked }}</p>
  </div>
  
  <!-- 选择框 -->
  <div>
    <select v-model="selected">
      <option disabled value="">请选择</option>
      <option>A</option>
      <option>B</option>
      <option>C</option>
    </select>
    <p>选中的值: {{ selected }}</p>
  </div>
</div>
html 复制代码
new Vue({
  el: '#app',
  data: {
    message: '',
    multilineText: '',
    checked: false,
    checkedNames: [],
    picked: '',
    selected: ''
  }
})

修饰符:

.lazy - 转为在change事件后同步

.number - 将输入值转为数值类型

.trim - 自动过滤输入的首尾空白字符

相关推荐
AI浩1 天前
【Labelme数据操作】LabelMe标注批量复制工具 - 完整教程
运维·服务器·前端
涔溪1 天前
CSS 网格布局(Grid Layout)核心概念、基础语法、常用属性、实战示例和进阶技巧全面讲解
前端·css
2401_878454531 天前
浏览器工作原理
前端·javascript
石像鬼₧魂石1 天前
如何配置Fail2Ban的Jail?
linux·学习·ubuntu
西陵1 天前
为什么说 AI 赋能前端开发,已经不是选择题,而是必然趋势?
前端·架构·ai编程
by__csdn1 天前
Vue3 setup()函数终极攻略:从入门到精通
开发语言·前端·javascript·vue.js·性能优化·typescript·ecmascript
天天扭码1 天前
前端如何实现RAG?一文带你速通,使用RAG实现长期记忆
前端·node.js·ai编程
Nan_Shu_6141 天前
学习:VueUse (1)
学习
一条可有可无的咸鱼1 天前
企业招聘信息,企业资讯进行公示
java·vue.js·spring boot·uni-app