VueJS 模板语法
-
定义和使用
Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解析器解析。在底层的实现上,Vue 将模板编译成虚拟 DOM 渲染函数。结合响应系统,Vue 能够智能地计算出最少需要重新渲染多少组件,并把 DOM 操作次数减到最少。如果你熟悉虚拟 DOM 并且偏爱 JavaScript 的原始力量,你也可以不用模板,直接写渲染 (render) 函数,使用可选的 JSX 语法。
-
插值
通过 {{}} 语法,可以实现元素文本插值{{}} 会将数据解释为普通文本下面是绑定元素文本值的一个例子:
尝试一下<div id="app"> 绑定的数据:{{msg}} </div> <script> var vm = new Vue({ el: '#app', data: { msg: '这个就是vue.js' } }); </script>
示例说明:将 Vue 根实例的一个属性 msg,绑定到 div 元素的文本值msg 改变,元素的文本值就会改变可以尝试一下打开控制台输入 vm.msg = 123,可以看到元素文本值改变,如下图:通过 v-once 指令可以实现一次性地插值:<div id="app" v-once> 绑定的数据:{{msg}} </div> <script> var vm = new Vue({ el: '#app', data: { msg: '这个就是vue.js' } }); </script>
当 msg 改变时,元素文本值不会更新,如下图: -
原始 HTML 元素
双大括号会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML,你需要使用 v-html 指令:
尝试一下<div id="app"> <span v-html="Html">这个是span</span> </div> <script> var vm = new Vue({ el: '#app', data: { Html: '<div>这个是div</div>' } }); </script>
上面例子中,最终的HTML元素是这样的 '这个是span' 被 Html 的内容替换<span> <div>这个是div</div> </span>
在 v-html 中也是可以使用表达式的
-
HTML 元素的属性值
Mustache 语法不能作用在 HTML 特性上,遇到这种情况应该使用 v-bind 指令下面是一个例子将 HTML 元素的 id 属性与 Vue 根实例的 num 属性绑定:
尝试一下<div id="app" > <div v-bind:id="num" >{{ num }}</div> </div> <script> var vm = new Vue({ el: '#app', data: { num: 123 } }); </script>
改变 num 的值,元素的属性值会刷新;可以在控制输入 vm.num = 666,可以看见 id 属性的值变成 666在 v-bind 中也是可以使用表达式的
-
使用 JavaScript 表达式
迄今为止,在我们的模板中,我们一直都只绑定简单的属性键值。但实际上,对于所有的数据绑定,Vue.js 都提供了完全的 JavaScript 表达式支持。{{ number + 1 }} {{ ok ? 'YES' : 'NO' }} {{ message.split('').reverse().join('') }} <div v-bind:id="'list-' + id"></div>
这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析。有个限制就是,每个绑定都只能包含单个表达式,所以下面的例子都不会生效。//这是语句,不是表达式 {{ var a = 1 }} //流控制也不会生效,请使用三元表达式 {{ if (ok) { return message } }}
模板表达式都被放在沙盒中,只能访问全局变量的一个白名单,如 Math 和 Date 。你不应该在模板表达式中试图访问用户定义的全局变量。
-
缩写
v- 前缀作为一种视觉提示,用来识别模板中 Vue 特定的特性。当你在使用 Vue.js 为现有标签添加动态行为 (dynamic behavior) 时,v- 前缀很有帮助,然而,对于一些频繁用到的指令来说,就会感到使用繁琐。同时,在构建由 Vue 管理所有模板的单页面应用程序 (SPA - single page application) 时,v- 前缀也变得没那么重要了。因此,Vue 为 v-bind 和 v-on 这两个最常用的指令,提供了特定简写。v-bind 缩写
//完整语法 <a v-bind:href="url">...</a> //缩写 <a :href="url">...</a>
v-on 缩写
//完整语法 <a v-on:click="doSomething">...</a> //缩写 <a @click="doSomething">...</a>
它们看起来可能与普通的 HTML 略有不同,但 : 与 @ 对于特性名来说都是合法字符,在所有支持 Vue 的浏览器都能被正确地解析。而且,它们不会出现在最终渲染的标记中。缩写语法是完全可选的,但随着你更深入地了解它们的作用,你会庆幸拥有它们。