Vue.js 的模板是基于 DOM 实现的。这意味着全部的 Vue.js 模板都是可解析的有效的 HTML,且经过一些特殊的特性作了加强。Vue 模板于是从根本上不一样于基于字符串的模板,请记住这点。html
数据绑定最基础的形式是文本插值,使用 “Mustache” 语法(双大括号):vue
<span>Message: {{ msg }}</span>
Mustache 标签会被相应数据对象的 msg
属性的值替换。每当这个属性变化时它也会更新。api
你也能够只处理单次插值,从此的数据变化就不会再引发插值更新了:浏览器
<span>This will never change: {{* msg }}</span>
双 Mustache 标签将数据解析为纯文本而不是 HTML。为了输出真的 HTML 字符串,须要用三 Mustache 标签:app
<div>{{{ raw_html }}}</div>
内容以 HTML 字符串插入——数据绑定将被忽略。若是须要复用模板片段,应当使用partials。函数
在网站上动态渲染任意 HTML 是很是危险的,由于容易致使 XSS 攻击。记住,只对可信内容使用 HTML 插值,永不用于用户提交的内容。学习
Mustache 标签也能够用在 HTML 特性 (Attributes) 内:网站
<div id="item-{{ id }}"></div>
注意在 Vue.js 指令和特殊特性内不能用插值。没必要担忧,若是 Mustache 标签用错了地方 Vue.js 会给出警告。url
放在 Mustache 标签内的文本称为绑定表达式。在 Vue.js 中,一段绑定表达式由一个简单的 JavaScript 表达式和可选的一个或多个过滤器构成。spa
到目前为止,咱们的模板只绑定到简单的属性键。不过实际上 Vue.js 在数据绑定内支持全功能的 JavaScript 表达式:
{{ number + 1 }} {{ ok ? 'YES' : 'NO' }} {{ message.split('').reverse().join('') }}
这些表达式将在所属的 Vue 实例的做用域内计算。一个限制是每一个绑定只能包含单个表达式,所以下面的语句是无效的:
<!-- 这是一个语句,不是一个表达式: --> {{ var a = 1 }} <!-- 流程控制也不能够,可改用三元表达式 --> {{ if (ok) { return message } }}
Vue.js 容许在表达式后添加可选的“过滤器 (Filter) ”,以“管道符”指示:
{{ message | capitalize }}
这里咱们将表达式 message
的值“管输(pipe)”到内置的 capitalize
过滤器,这个过滤器其实只是一个 JavaScript 函数,返回大写化的值。Vue.js 提供数个内置过滤器,在后面咱们会谈到如何开发本身的过滤器。
注意管道语法不是 JavaScript 语法,所以不能在表达式内使用过滤器,只能添加到表达式的后面。
过滤器能够串联:
{{ message | filterA | filterB }}
过滤器也能够接受参数:
{{ message | filterA 'arg1' arg2 }}
过滤器函数始终以表达式的值做为第一个参数。带引号的参数视为字符串,而不带引号的参数按表达式计算。这里,字符串 'arg1'
将传给过滤器做为第二个参数,表达式 arg2
的值在计算出来以后做为第三个参数。
指令 (Directives) 是特殊的带有前缀 v-
的特性。指令的值限定为绑定表达式,所以上面提到的 JavaScript 表达式及过滤器规则在这里也适用。指令的职责就是当其表达式的值改变时把某些特殊的行为应用到 DOM 上。咱们来回头看下“概述”里的例子:
<p v-if="greeting">Hello!</p>
这里 v-if
指令将根据表达式 greeting
值的真假删除/插入 <p>
元素。
有些指令能够在其名称后面带一个“参数” (Argument),中间放一个冒号隔开。例如,v-bind
指令用于响应地更新 HTML 特性:
<a v-bind:href="url"></a>
这里 href
是参数,它告诉 v-bind
指令将元素的 href
特性跟表达式 url
的值绑定。可能你已注意到能够用特性插值 href="{{url}}"
得到一样的结果:这样没错,而且实际上在内部特性插值会转为 v-bind
绑定。
另外一个例子是 v-on
指令,它用于监听 DOM 事件:
<a v-on:click="doSomething">
这里参数是被监听的事件的名字。咱们也会详细说明事件绑定。
修饰符 (Modifiers) 是以半角句号 .
开始的特殊后缀,用于表示指令应当以特殊方式绑定。例如 .literal
修饰符告诉指令将它的值解析为一个字面字符串而不是一个表达式:
<a v-bind:href.literal="/a/b/c"></a>
固然,这彷佛没有意义,由于咱们只须要使用 href="/a/b/c"
而没必要使用一个指令。这个例子只是为了演示语法。后面咱们将看到修饰符更多的实践用法。
v-
前缀是一种标识模板中特定的 Vue 特性的视觉暗示。当你须要在一些现有的 HTML 代码中添加动态行为时,这些前缀能够起到很好的区分效果。但你在使用一些经常使用指令的时候,你会感受一直这么写实在是啰嗦。并且在构建单页应用(SPA )时,Vue.js 会管理全部的模板,此时 v-
前缀也没那么重要了。所以Vue.js 为两个最经常使用的指令 v-bind
和v-on
提供特别的缩写:
v-bind
缩写<!-- 完整语法 --> <a v-bind:href="url"></a> <!-- 缩写 --> <a :href="url"></a> <!-- 完整语法 --> <button v-bind:disabled="someDynamicCondition">Button</button> <!-- 缩写 --> <button :disabled="someDynamicCondition">Button</button>
v-on
缩写<!-- 完整语法 --> <a v-on:click="doSomething"></a> <!-- 缩写 --> <a @click="doSomething"></a>
它们看起来跟“合法”的 HTML 有点不一样,可是它们在全部 Vue.js 支持的浏览器中都能被正确地解析,而且不会出如今最终渲染的标记中。缩写语法彻底是可选的,不过随着一步步学习的深刻,你会庆幸拥有它们。