Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML,所以能被遵循规范的浏览器和 HTML 解析器解析。
在底层的实现上,Vue 将模板编译成虚拟 DOM 渲染函数。结合响应系统,Vue 能够智能地计算出最少需要重新渲染多少组件,并把 DOM 操作次数减到最少。
数据绑定最常见的形式就是使用 “Mustache” 语法 (双大括号 {{...}}) 的文本插值,例如:
<span>Message: {{ msg }}</span>
Mustache 标签(即 {{ msg }})将会被替换为对应数据对象上 msg 属性的值。无论何时,绑定的数据对象上 msg 属性发生了改变,插值处的内容都会更新。
通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新。注意:这会影响到该节点上的其它数据绑定:
<span v-once>这个将不会改变: {{ msg }}</span>
完整代码:
<html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue</title> <!-- 使用 CDN 引入 Vue 库 --> <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> </head> <body> <div id="app"> <span v-once>{{message}}</span> </div> <script type="text/javascript"> var app = new Vue({ el: "#app", data: { message: "Hello Vue" } }); </script> </body> </html>
运行效果图:
双大括号会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML,你需要使用 v-html 指令,例如:
<p>Using mustaches: {{ rawHtml }}</p> <p>Using v-html directive: <span v-html="rawHtml"></span></p>
这个 span 的内容将会被替换成为 rawHtml 属性的值,直接作为 HTML —— 会忽略解析属性值中的数据绑定。你不能使用 v-html 来复合局部模板,因为 Vue 不是基于字符串的模板引擎。反之,对于用户界面 (UI),组件更适合作为可重用和可组合的基本单位。
注意:动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS(跨站脚本攻击)攻击。请只对可信内容使用 HTML 插值,绝不要对用户提供的内容使用插值。
完整代码:
<html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue</title> <!-- 使用 CDN 引入 Vue 库 --> <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> </head> <body> <div id="app"> <p>Using mustaches: {{ rawHtml }}</p> <p>Using v-html directive: <span v-html="rawHtml"></span></p> </div> <script type="text/javascript"> var app = new Vue({ el: "#app", data: { rawHtml: "<strong>Hello Vue</strong>" } }); </script> </body> </html>
运行效果图:
Mustache 语法不能作用在 HTML 属性上,遇到这种情况应该使用 v-bind 指令,例如:
<div v-bind:id="dynamicId"></div>
对于布尔属性 (它们只要存在就意味着值为 true),v-bind 工作起来略有不同,在这个例子中:
<button v-bind:disabled="isButtonDisabled">Button</button>
如果 isButtonDisabled 的值是 null、undefined 或 false,则 disabled 属性甚至不会被包含在渲染出来的 <button> 元素中。
完整示例:
<html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue</title> <!-- 使用 CDN 引入 Vue 库 --> <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> </head> <body> <div id="app"> <div v-bind:id="dynamicId"></div> <button v-bind:disabled="isButtonDisabled1">Button1</button> <button v-bind:disabled="isButtonDisabled2">Button2</button> </div> <script type="text/javascript"> var app = new Vue({ el: "#app", data: { dynamicId: "myId", isButtonDisabled1: true, isButtonDisabled2: undefined } }); </script> </body> </html>
运行效果图: