Vue 模板语法完全指南:从插值表达式到动态指令,彻底搞懂 Vue 模板语言

Vue 的模板语法不仅是"语法糖",它是一整套声明式编程语言 ,能让你用 HTML 写出拥有响应式能力的页面。 这篇文章将在官方文档的基础上更进一步:不遗漏任何知识点,同时结合开发经验讲清楚每一个语法点"是什么"、"怎么用"、"有什么坑"。


一、基础插值语法:Vue 最核心的语法形式

📍

{{ }}

插值表达式

最基础的模板语法,展示变量值:

js 复制代码
<span>{{ message }}</span>

你可以在其中使用任意合法的 JavaScript 表达式

js 复制代码
<p>{{ count + 1 }}</p>
<p>{{ user.name.toUpperCase() }}</p>
<p>{{ items.length > 0 ? '有数据' : '空' }}</p>

⚠️ 不能使用语句(如 if、for、赋值等):

js 复制代码
<!-- ❌ 错误 -->
{{ let a = 1 }}

📍 HTML 插值:

v-html

用于将 HTML 字符串插入页面:

js 复制代码
<p v-html="htmlContent"></p>
js 复制代码
data() {
  return {
    htmlContent: '<strong style="color: red">红字</strong>'
  }
}

⚠️ 安全提醒:谨慎使用 v-html!不要渲染任何用户输入或外部内容,避免 XSS 攻击。


二、属性绑定语法:v-bind 的各种妙用

双大括号不能在 HTML attributes 中使用。想要响应式地绑定一个 attribute,应该使用 v-bind 指令

📍 动态绑定属性

js 复制代码
<img v-bind:src="imgUrl" />
<!-- 简写 -->
<img :src="imgUrl" />

支持任意属性名:href、id、class、style、disabled......

📍 绑定布尔值

Vue 会根据布尔值自动添加或移除该属性:

js 复制代码
<button :disabled="isDisabled">提交</button>

📍 动态绑定 class

js 复制代码
<div :class="{ active: isActive, error: hasError }"></div>

也可以使用数组形式:

ruby 复制代码
<div :class="['base', dynamicClass]"></div>

📍 绑定内联样式

ruby 复制代码
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>

也支持绑定 style 对象:

css 复制代码
styleObject: {
  color: 'red',
  backgroundColor: 'black'
}

三、指令系统:Vue 模板语法的核心机制

所有指令都以 v- 开头,告诉 Vue 这个属性是 Vue 的语法,而不是 HTML 标准。

📍 v-if / v-else-if / v-else:条件渲染

xml 复制代码
<p v-if="score > 90">优秀</p>
<p v-else-if="score > 60">及格</p>
<p v-else>不及格</p>

⚠️ Vue 会彻底"移除"不满足条件的元素,而不是隐藏它。


📍 v-show:显示/隐藏元素

ini 复制代码
<p v-show="isVisible">我可以显示或隐藏</p>

和 v-if 不同的是:

✅ v-show 是通过设置 display: none 来隐藏元素

✅ 元素始终存在于 DOM 中,适用于频繁切换场景


📍 v-for:列表渲染

css 复制代码
<ul>
  <li v-for="(item, index) in items" :key="item.id">{{ index }} - {{ item.name }}</li>
</ul>

可遍历:

  • 数组

  • 字符串

  • 对象(使用 Object.entries)

  • 数字(生成范围)

🔑 建议始终写 :key,提高性能 & 避免渲染异常。


📍 v-on:事件监听

xml 复制代码
<button v-on:click="handleClick">点击</button>
<!-- 简写 -->
<button @click="handleClick">点击</button>

可以传参:

ini 复制代码
<button @click="addToCart(product.id)">添加</button>

📍 v-model:表单双向绑定

ini 复制代码
<input v-model="searchText" />

支持多种表单控件:

  • <input type="text">

  • <textarea>

  • <select>

  • <input type="checkbox">

  • <input type="radio">

📌 可用修饰符:

修饰符 含义
.lazy 在 blur 时更新数据(不是每次输入)
.number 自动转为数字
.trim 去除首尾空格

四、动态参数 & 动态事件名

xml 复制代码
<!-- 动态绑定属性名 -->
<a v-bind:[attrName]="value">链接</a>

<!-- 动态事件名 -->
<button v-on:[eventName]="handler">点击</button>

⚠️ 规则限制:

  • \] 中必须是字符串或能返回字符串的表达式


五、修饰符机制:让模板行为更"贴合业务"

📍 v-on 事件修饰符

xml 复制代码
<!-- 阻止默认事件 -->
<form @submit.prevent="submitForm"></form>

<!-- 阻止事件冒泡 -->
<button @click.stop="onClick"></button>

<!-- 只触发一次 -->
<button @click.once="onClick"></button>

常用修饰符:

修饰符 含义
.stop 阻止事件冒泡
.prevent 阻止默认行为
.self 只响应自身事件
.once 只触发一次
.capture 捕获阶段触发

📍 v-model 修饰符

ini 复制代码
<input v-model.trim="name" />
<input v-model.number="age" />

六、模板中使用 JavaScript 表达式的限制与建议

✅ 支持的表达式类型:

  • 变量引用

  • 方法调用

  • 三元表达式

  • 数组、对象访问

  • 算术 & 逻辑运算

❌ 不支持的语法:

  • 变量声明 (let a = 1)
  • 流程控制(if, for)
  • 多条语句

七、最佳实践 & 常见错误汇总

场景 推荐写法 常见错误
条件渲染 v-if="isOk" 不加 v-else 顺序错误
表单绑定 v-model.number="age" 忘了加 .number 导致类型不对
动态 class :class="{ active: isActive }" 写成字符串拼接
DOM 操作 尽量用 Vue 控制 DOM 不建议直接操作 DOM 元素

🧭 最后总结:Vue 模板语法的六大核心能力

  1. 插值表达式:展示数据 {{ msg }}
  2. 属性绑定::href="url" / :style="..."
  3. 指令系统:v-if, v-for, v-model
  4. 事件监听:@click="doSomething"
  5. 动态参数::['href'] / @['click']
  6. 修饰符机制:.prevent .trim .once

🧑‍💻 写给开发者的几句话:

  • 模板语法不只是"语法糖",而是 Vue 响应式系统的"语言接口"
  • 模板中逻辑越少越好,建议将复杂表达式抽到 computed 或 methods
  • 不管多复杂,最终都要回到"数据驱动视图"的核心理念

❤️ 如果你喜欢这样的讲解风格

欢迎关注我,持续输出 Vue相关的文章

相关推荐
咖啡の猫36 分钟前
Shell脚本-for循环应用案例
前端·chrome
百万蹄蹄向前冲3 小时前
Trae分析Phaser.js游戏《洋葱头捡星星》
前端·游戏开发·trae
朝阳5814 小时前
在浏览器端使用 xml2js 遇到的报错及解决方法
前端
GIS之路4 小时前
GeoTools 读取影像元数据
前端
ssshooter4 小时前
VSCode 自带的 TS 版本可能跟项目TS 版本不一样
前端·面试·typescript
Jerry5 小时前
Jetpack Compose 中的状态
前端
dae bal6 小时前
关于RSA和AES加密
前端·vue.js
柳杉6 小时前
使用three.js搭建3d隧道监测-2
前端·javascript·数据可视化
lynn8570_blog6 小时前
低端设备加载webp ANR
前端·算法
LKAI.6 小时前
传统方式部署(RuoYi-Cloud)微服务
java·linux·前端·后端·微服务·node.js·ruoyi