Vue.js 使用了基于 HTML 的模板语法,容许开发者声明式地将 DOM 绑定至底层应用实例的数据。全部 Vue.js 的模板都是合法的 HTML,因此能被遵循规范的浏览器和 HTML 解析器解析。html
在底层的实现上,Vue 将模板编译成虚拟 DOM 渲染函数。结合响应系统,Vue 可以智能地计算出最少须要从新渲染多少组件,并把 DOM 操做次数减到最少。vue
若是你熟悉虚拟 DOM 而且偏心 JavaScript 的原始力量,你也能够不用模板,直接写渲染 (render) 函数,使用可选的 JSX 语法。npm
文本中的数据绑定是数据绑定最多见的形式,就是使用双大括号 {{}},这个大括号的内容时刻与响应式系统中监测的数据绑定着,只要响应式系统中的数据发生变化,大括号的内容就会跟着发生变化,接下来咱们来试试一下吧。浏览器
在 src/views/
新建 TemplateM.vue
:app
<template>
<div class="template-m-wrap">
{{ count }}
<br />
<button @click="click">加 1</button>
</div>
</template>
<script>
export default {
name: "TemplateM",
data() {
return {
count: 0,
};
},
methods: {
click() {
this.count++;
},
},
};
</script>
运行 npm run serve
跑起来以后,使用 http://localhost:8080/template_m
查看浏览器:ide
咱们上面说道,双大括号会将数据解析为普通文本,而非 HTML 代码,要实现真正的 HTML 代码的绑定,则须要一些指令来配合了。函数
接着在上面的例子的基础上面加上咱们的代码:this
<template>
<div class="template-m-wrap">
{{ count }}
<br />
<button @click="click">加 1</button>
<br />
这是原始 HTML 演示
<br/>
<div v-text="msg">
绑定文本
</div>
<div v-html="msg2">
绑定 HTML
</div>
<div v-text="msg" v-html="msg2"></div>
</div>
</template>
<script>
export default {
name: "TemplateM",
data() {
return {
count: 0,
msg: 111111,
msg2: `<h2>这是一个 h2 标签</h2>`
};
},
methods: {
click() {
this.count++;
},
},
};
</script>
接下来,咱们一样访问 http://localhost:8080/template_m
查看浏览器:spa
从上图咱们能够看到 v-text 用于渲染文本,v-html 用于渲染带有原始 HTML 代码的指令,最后一行代码咱们得出结论,多个指令一同使用时,后面的指令会覆盖前面的指令。code
咱们原生的 HTML 元素不是有不少不同的属性?像 title
,class
,id
等等,Vue 其实也提供了这些属性的绑定规则。
接着在 src/views/TemplateM.vue
写下这些代码:
<template>
<div class="template-m-wrap">
{{ count }}
<br />
<button @click="click">加 1</button>
<br />
这是原始 HTML 演示
<br/>
<div v-text="msg">
绑定文本
</div>
<div v-html="msg2">
绑定 HTML
</div>
<div v-text="msg" v-html="msg2"></div>
<br />
<div v-bind:id="id" v-bind:class="cls" v-bind:title="title">
原生 HTML 属性绑定规则
</div>
</div>
</template>
<script>
export default {
name: "TemplateM",
data() {
return {
count: 0,
msg: 111111,
msg2: `<h2>这是一个 h2 标签</h2>`,
id: 'hhfff',
cls: 'red',
title: '这是原生 HTML 属性规则绑定提示'
};
},
methods: {
click() {
this.count++;
},
},
};
</script>
最后仍是访问 http://localhost:8080/template_m
查看浏览器,咱们能够看到 id,class,title 都被渲染在 HTML 属性上面了:
实际上 Vue 给咱们提供了不少关于 js 表达式,使得咱们开发更加高效,敏捷,接着上面的代码继续书写:
<template>
<div class="template-m-wrap">
{{ count }}
<br/>
{{count+msg}}
<br>
{{ok ? '好的' : '坏的'}}
<br />
{{name.split('')[0]}}
</div>
</template>
<script>
export default {
name: "TemplateM",
data() {
return {
count: 0,
msg: 1111,
ok: true,
name: 'Ken'
};
},
};
</script>
接下来,仍是访问 http://localhost:8080/template_m
查看浏览器:
指令 (Directives) 是带有 v-
前缀的特殊 attribute。指令 attribute 的值预期是单个 JavaScript 表达式 (v-for
和 v-on
是例外状况,稍后咱们再讨论)。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地做用于 DOM。回顾咱们在介绍中看到的例子:
<template>
<div class="template-m-wrap">
<div v-if="ok">ok</div>
<div v-else>not ok</div>
</div>
</template>
<script>
export default {
name: "TemplateM",
data() {
return {
ok: true,
};
},
};
</script>
仍是访问 http://localhost:8080/template_m
查看浏览器,只渲染了 ok:
像一些指令可以接收一个参数,在指令名称以后以 :
冒号的形式,例如咱们上面讲到的 v-text
,v-html
,v-bind
,v-on
:
<div
v-text="msg"
v-html="msg2"
v-bind:class="cls"
v-bind:id="id"
v-bind:title="title"
></div> // 绑定变量
<button v-on:click="click"></button> // 监听点击事件
动态参数,对参数进行变量化。使用 [] 来解析咱们绑定的属性变量:
<template>
<div>
<div
v-bind:[cls]="cls"
v-bind:[id]="id"
v-bind:[title]="title"
></div> // 绑定变量
<button v-on:[eventName]="click">anana</button> // 监听点击事件
</div>
</template>
<script>
export default {
name: 'TemplateM',
data() {
return {
cls: "class",
id: 'id',
title: 'title',
eventName: 'click'
}
},
methods: {
click() {}
}
}
</script>
v-
前缀做为一种视觉提示,用来识别模板中 Vue 特定的 attribute。当你在使用 Vue.js 为现有标签添加动态行为 (dynamic behavior) 时,v- 前缀颇有帮助,然而,对于一些频繁用到的指令来讲,就会感到使用繁琐。同时,在构建由 Vue 管理全部模板的单页面应用程序 (SPA - single page application) 时,v-
前缀也变得没那么重要了。所以,Vue 为 v-bind
和 v-on
这两个最经常使用的指令,提供了特定简写:
// 完整的写法
<div v-bind:id="id" v-bind:class="cls" v-bind:title="title">
// 缩写方式
<div :id="id" :class="cls" :title="title">
// 动态参数
<div :[id]="id" :[cls]="cls" :[title]="title">
<button v-on:click="click">anana</button> // 监听点击事件
<button :[eventName]="click">anana</button> // 监听点击事件
<button @[eventName]="click">anana</button> // 监听点击事件
<button @click="click">anana</button> // 监听点击事件
它们看起来可能与普通的 HTML 略有不一样,但 :
与 @
对于 attribute 名来讲都是合法字符,在全部支持 Vue 的浏览器都能被正确地解析。并且,它们不会出如今最终渲染的标记中。缩写语法是彻底可选的,但随着你更深刻地了解它们的做用,你会庆幸拥有它们。
动态参数预期会求出一个字符串,异常状况下值为 null
。这个特殊的 null
值能够被显性地用于移除绑定。任何其它非字符串类型的值都将会触发一个警告。
动态参数表达式有一些语法约束,由于某些字符,如空格和引号,放在 HTML attribute 名里是无效的。例如:
<!-- 这会触发一个编译警告 -->
<a v-bind:['foo' + bar]="value"> ... </a>
变通的办法是使用没有空格或引号的表达式,或用计算属性替代这种复杂表达式。
在 DOM 中使用模板时 (直接在一个 HTML 文件里撰写模板),还须要避免使用大写字符来命名键名,由于浏览器会把 attribute 名所有强制转为小写:
<!--
在 DOM 中使用模板时这段代码会被转换为 `v-bind:[someattr]`。
除非在实例中有一个名为“someattr”的 property,不然代码不会工做。
-->
<a v-bind:[someAttr]="value"> ... </a>
模板表达式都被放在沙盒中,只能访问全局变量的一个白名单,如 Math
和 Date
。你不该该在模板表达式中试图访问用户定义的全局变量。