在上篇中介绍了Vue的相关定义和简单语法,本节继续来看Vue的模板语法、Data Property 和方法。
一、插值
数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值:
Message: {{ msg }}
v-once:执行一次性地插值,当数据改变时,插值处的内容不会更新。
v-html:输出真正的 HTML
v-bind:id:绑定attribute,如果绑定的值是 null 或 undefined,那么该 attribute 将不会被包含在渲染的元素上。
除此之外还可以使用 JavaScript 表达式来绑定相关内容:
{{ number + 1 }}
{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}
这些表达式会在当前活动实例的数据作用域下作为 JavaScript 被解析。有个限制就是,每个绑定都只能包含单个表达式
二、指令
指令 (Directives) 是带有 v- 前缀的特殊 attribute。指令 attribute 的值预期是单个 JavaScript 表达式。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。比如:
现在你看到我了
这里,v-if 指令将根据表达式 seen 的值的真假来插入或者移除
元素。
一些指令能够接收一个“参数”,在指令名称之后以冒号表示。例如,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
事件绑定中还可以使用修饰符,比如:
。.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault()三、缩写
v- 前缀作为一种视觉提示,用来识别模板中 Vue 特定的 attribute。当你在使用 Vue.js 为现有标签添加动态行为 (dynamic behavior) 时,v- 前缀很有帮助。
1
2 ...
3
4
5 ...
6
7
8 ...
9
10 ...
11
12
13 ...
14
15
16 ...
它们看起来可能与普通的 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
Vue 没有内置支持防抖和节流,但可以使用 Lodash 等库来实现。
Lodash是什么?
Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。lodash 通过降低 array、number、objects、string 等等的使用难度从而让 JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于
遍历 array、object 和 string
对值进行操作和检测
创建符合功能的函数
Lodash不需要引入其他第三方依赖。意在提高开发者效率,提高JS原生方法性能的JS库。很多方法lodash已经帮你写好了,直接调用就行,不用自己费尽心思去写了,而且可以统一方法的一致性。Lodash使用了一个简单的 _ 符号,就像Jquery的 $ 一样,十分简洁。
1
2 Vue.createApp({
3 methods: {
4 // 用 Lodash 的防抖函数
5 click: _.debounce(function() {
6 // ... 响应点击 ...
7 }, 500)
8 }
9 }).mount('#app')
10
但是,这种方法对于可复用组件有潜在的问题,因为它们都共享相同的防抖函数。为了使组件实例彼此独立,可以在生命周期钩子的 created 里添加该防抖函数:
1
2
3
4
5
6
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