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相关的文章

相关推荐
CCF_NOI.1 小时前
谷歌浏览器深入用法全解析:解锁高效网络之旅
大数据·运维·服务器·前端·计算机·谷歌
paopaokaka_luck4 小时前
基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
前端·javascript·vue.js·spring boot·后端·小程序·uni-app
患得患失9494 小时前
【前端】【vscode】【.vscode/settings.json】为单个项目配置自动格式化和开发环境
前端·vscode·json
飛_5 小时前
解决VSCode无法加载Json架构问题
java·服务器·前端
YGY Webgis糕手之路7 小时前
OpenLayers 综合案例-轨迹回放
前端·经验分享·笔记·vue·web
90后的晨仔7 小时前
🚨XSS 攻击全解:什么是跨站脚本攻击?前端如何防御?
前端·vue.js
Ares-Wang7 小时前
JavaScript》》JS》 Var、Let、Const 大总结
开发语言·前端·javascript
德育处主任8 小时前
p5.js 正方形square的基础用法
前端·数据可视化·canvas