在上篇中介绍了Vue的相关定义和简单语法,本节继续来看Vue的模板语法、Data Property 和方法。
一、插值
数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值:
<span>Message: {{ msg }}</span>
v-once:执行一次性地插值,当数据改变时,插值处的内容不会更新。
v-html:输出真正的 HTML
v-bind:id:绑定attribute,如果绑定的值是 null
或 undefined
,那么该 attribute 将不会被包含在渲染的元素上。
除此之外还可以使用 JavaScript 表达式来绑定相关内容:
{{ number + 1 }} {{ ok ? 'YES' : 'NO' }} {{ message.split('').reverse().join('') }} <div v-bind:id="'list-' + id"></div>
这些表达式会在当前活动实例的数据作用域下作为 JavaScript 被解析。有个限制就是,每个绑定都只能包含单个表达式
二、指令
指令 (Directives) 是带有 v-
前缀的特殊 attribute。指令 attribute 的值预期是单个 JavaScript 表达式。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。比如:
<p v-if="seen">现在你看到我了</p>
这里,v-if
指令将根据表达式 seen
的值的真假来插入或者移除 <p>
元素。
一些指令能够接收一个“参数”,在指令名称之后以冒号表示。例如,v-bind
:href
指令可以用于响应式地更新 HTML href attribute 。在这里 href
是参数,告知 v-bind
指令将该元素的 href
attribute 与表达式 url
的值绑定。
另一个例子是 v-on:click
指令,它用于监听 DOM 事件,在这里参数是监听的事件名 click事件。
也可以在指令参数中使用 JavaScript 表达式,方法是用方括号括起来。比如:v-bind:[attributeName]
这里的 attributeName
会被作为一个 JavaScript 表达式进行动态求值,求得的值将会作为最终的参数来使用。例如,如果你的组件实例有一个 data property attributeName
,其值为 "href"
,那么这个绑定将等价于 v-bind:href
。同样的也可以传入事件名称,比如:v-on:[eventName]
当 eventName
的值为 "focus"
时,v-on:[eventName]
将等价于 v-on:focus
事件绑定中还可以使用修饰符,比如:<form v-on:submit.prevent="onSubmit">...</form>。
.prevent
修饰符告诉 v-on
指令对于触发的事件调用 event.preventDefault()
三、缩写
v-
前缀作为一种视觉提示,用来识别模板中 Vue 特定的 attribute。当你在使用 Vue.js 为现有标签添加动态行为 (dynamic behavior) 时,v- 前缀很有帮助。
1 <!-- 完整语法 --> 2 <a v-bind:href="url"> ... </a> 3 4 <!-- 缩写 --> 5 <a :href="url"> ... </a> 6 7 <!-- 动态参数的缩写 --> 8 <a :[key]="url"> ... </a> 9 10 <a v-on:click="doSomething"> ... </a> 11 12 <!-- 缩写 --> 13 <a @click="doSomething"> ... </a> 14 15 <!-- 动态参数的缩写 (2.6.0+) --> 16 <a @[event]="doSomething"> ... </a>
它们看起来可能与普通的 HTML 略有不同,但 :
与 @
对于 attribute 名来说都是合法字符,在所有支持 Vue 的浏览器都能被正确地解析。而且,它们不会出现在最终渲染的标记中。
需要注意的是:
- 动态参数预期会求出一个字符串,异常情况下值为
null
。这个特殊的null
值可以被显性地用于移除绑定。任何其它非字符串类型的值都将会触发一个警告。 - 动态参数表达式有一些语法约束,因为某些字符,如空格和引号,放在 HTML attribute 名里是无效的。
- 在 DOM 中使用模板时 (直接在一个 HTML 文件里撰写模板),还需要避免使用大写字符来命名键名,因为浏览器会把 attribute 名全部强制转为小写。
- 模板表达式都被放在沙盒中,只能访问全局变量的一个白名单,如
Math
和Date
。你不应该在模板表达式中试图访问用户定义的全局变量。
四、Data Property
组件的 data
选项是一个函数。Vue 在创建新组件实例的过程中调用此函数。它返回一个对象,然后 Vue 会通过响应性系统将其包裹起来,并以 this
的形式存储在组件实例中。该对象的任何顶级 property 也直接通过组件实例暴露出来。
1 export default { 2 name: "Test", 3 components: { 4 TodoItem, 5 }, 6 data() { 7 return { 8 message: "safsadf", 9 list: [ 10 { id: 0, text: "Vegetables" }, 11 { id: 1, text: "Cheese" }, 12 { id: 2, text: "Whatever else humans are supposed to eat" }, 13 ], 14 }; 15 }, 16 methods: { 17 reverseMessage() { 18 this.message = this.message.split("").reverse().join(""); 19 }, 20 }, 21 };
这些实例 property 仅在实例首次创建时被添加,所以你需要确保它们都在 data
函数中。必要时,要对尚未提供所需值的 property 使用 null
、undefined
或其他占位的值。
五、方法
用 methods
选项向组件实例添加方法。Vue 自动为 methods
绑定 this
,以便于它始终指向组件实例。这将确保方法在用作事件监听或回调时保持正确的 this
指向。在定义 methods
时应避免使用箭头函数,因为这会阻止 Vue 绑定恰当的 this
指向。这些 methods
和组件实例的其它所有 property 一样可以在组件的模板中被访问。在模板中,它们通常被当做事件监听使用:
1 <button @click="increment">Up vote</button>
Vue 没有内置支持防抖和节流,但可以使用 Lodash 等库来实现。
Lodash是什么?
Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。lodash 通过降低 array、number、objects、string 等等的使用难度从而让 JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于
- 遍历 array、object 和 string
- 对值进行操作和检测
- 创建符合功能的函数
Lodash不需要引入其他第三方依赖。意在提高开发者效率,提高JS原生方法性能的JS库。很多方法lodash已经帮你写好了,直接调用就行,不用自己费尽心思去写了,而且可以统一方法的一致性。Lodash使用了一个简单的 _ 符号,就像Jquery的 $ 一样,十分简洁。
1 <script> 2 Vue.createApp({ 3 methods: { 4 // 用 Lodash 的防抖函数 5 click: _.debounce(function() { 6 // ... 响应点击 ... 7 }, 500) 8 } 9 }).mount('#app') 10 </script>
但是,这种方法对于可复用组件有潜在的问题,因为它们都共享相同的防抖函数。为了使组件实例彼此独立,可以在生命周期钩子的 created
里添加该防抖函数:
1 <template> 2 <div> 3 <button @click="debouncedClick">Save</button> 4 </div> 5 </template> 6 <script> 7 export default { 8 created() { 9 // 用 Lodash 的防抖函数 10 this.debouncedClick = _.debounce(this.click, 500); 11 }, 12 unmounted() { 13 // 移除组件时,取消定时器 14 this.debouncedClick.cancel(); 15 }, 16 methods: { 17 click() { 18 // ... 响应点击 ... 19 }, 20 } 21 }; 22 </script>