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

相关推荐
2501_915918413 小时前
Web 前端可视化开发工具对比 低代码平台、可视化搭建工具、前端可视化编辑器与在线可视化开发环境的实战分析
前端·低代码·ios·小程序·uni-app·编辑器·iphone
程序员的世界你不懂4 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
索迪迈科技4 小时前
网络请求库——Axios库深度解析
前端·网络·vue.js·北京百思可瑞教育·百思可瑞教育
gnip4 小时前
JavaScript二叉树相关概念
前端
attitude.x5 小时前
PyTorch 动态图的灵活性与实用技巧
前端·人工智能·深度学习
β添砖java5 小时前
CSS3核心技术
前端·css·css3
空山新雨(大队长)5 小时前
HTML第八课:HTML4和HTML5的区别
前端·html·html5
猫头虎-前端技术6 小时前
浏览器兼容性问题全解:CSS 前缀、Grid/Flex 布局兼容方案与跨浏览器调试技巧
前端·css·node.js·bootstrap·ecmascript·css3·媒体
阿珊和她的猫6 小时前
探索 CSS 过渡:打造流畅网页交互体验
前端·css