第3章〓Vue 3基本指令
指令是Vue 3 模板中常用的功能之一,它们是带有 v前缀的特殊属性。指令的主要职责是在其值发生改变时,将相应的影响作用于DOM对象。Vue 3的指令在HTML中以页面元素的属性的方式使用,指令属性的值是JavaScript表达式。Vue 3的指令数量相对较少,本章将逐一介绍这些指令。
视频讲解
3.1条件渲染指令
条件渲染指令的主要功能是根据指令的值为true或false进而触发组件不同的表现形式。
3.1.1vif、velseif、velse
vif、velseif和velse这三个指令用于实现条件判断。vif根据其值有条件地渲染元素,当vif的值在 true 和 false 之间切换时,元素或组件将被销毁或重建。在组件被销毁或重建的过程中,会执行该组件相应的钩子函数,示例代码如下:
Display
Hide
Age: {{ age }}
Name:{{name}}
在浏览器中打开上述代码组成的页面,其渲染结果如图3.1所示。
图3.1vif渲染结果
当vif的值被设置为hide(即为 false)时,对应的元素并没有实际生成,而其他vif的值为 true 的元素正常生成。也就是说,当vif的值为 false 时,vif不会创建该元素; 当vif的值为 true 时,vif才会真正创建该元素。
切换到控制台窗口,将age属性的值修改为 20(即vm.age=20),然后切换回元素窗口,渲染结果如图3.2所示。
图3.2修改age属性值后vif页面的渲染结果
如果需要控制多个元素的创建或删除,可以使用元素将这些元素包装起来,然后在元素上使用vif,代码如下:
velseif和velse是vif的逻辑补充。示例代码如下:
随机数大于0.5时可以看到这个元素
随机数小于0.5时可以看到这个元素
velseif与vif一起使用,可以实现互斥的条件判断,代码如下:
优秀
良好
及格
不及格
需要注意的是,当一个条件被满足时,后续的条件判断都不会再执行,velseif和velse需要紧跟在vif或velseif之后。
3.1.2vshow
vshow根据其值切换元素的 CSS 样式中的 display 属性,当条件变化时,vshow会触发过渡效果,代码如下:
Display
Hide
Age: {{ age }}
Name:{{name}}
除了指令不同外,本节代码与3.1.1节中的vif代码完全相同。接下来观察 DOM 结构在执行之后有何不同,vshow测试页面的渲染结果如图3.3所示。
图3.3vshow测试页面的渲染结果
对比图3.1和图3.3的展示效果,vshow与vif似乎没有不同,但在页面结构中可以发现,vshow并没有根据条件不同而改变页面结构,它在HTML元素是否显示的实现机制上与vif不同。无论vshow的值是true还是false,vshow都会创建元素,它通过CSS样式中的display属性来控制元素是否显示。
3.1.3vshow与vif的选择
一般来说,vif有更高的切换开销,因为在切换时需要销毁和重新创建元素及其子组件,而vshow只需要改变CSS样式属性,因此在需要频繁地切换元素的显示或隐藏时,使用vshow更好。但在初始渲染时,vshow存在更高的开销,因为它需要先创建元素,然后再根据其值设置CSS样式属性,而vif只有在值为true时才会创建元素。因此,在条件改变较少的情况下,使用vif更好。
3.2列表渲染指令vfor
3.2.1基本用法
在 Vue 3 中,可以使用 vfor基于一个数组来渲染一个列表。vfor需要使用 item in items 形式的特殊语法,其中 items 是源数据数组,item 是被迭代的数组元素的别名,示例代码如下:
可以看到,组件实例的数据对象中定义了一个数组items,然后在元素上使用vfor遍历数组,这将循环渲染元素。在vfor块中,可以访问所有父作用域的属性,在每次循环时,item的值为数组当前索引的值,在元素内部,可以通过Mustache语法引用变量item。
最终渲染结果如图3.4所示。
图3.4vfor测试页面的渲染结果
除此之外,vfor 还支持一个可选的第二个参数,即当前项的索引,代码如下:
-
{{ index }} - {{ item.message }}
在Vue 3中,开发者不仅可以使用vfor遍历数组,也可以用 vfor 来遍历一个对象的所有可枚举属性。具体的使用方法就是使用of替代in作为分隔符,示例代码如下:
const vm = Vue.createApp({
data() {
return {
myObject: {
title: 'How to do lists in Vue',
author: 'Jane Doe',
publishedAt: '2016-04-10'
}
}
}
}).mount('#app');
可以增加第二个参数来获取属性的名称 (即键名),代码如下:
{{ name }}: {{ value }}
还可以增加第三个参数来获取索引,代码如下:
{{ index }}. {{ name }}: {{ value }}
在Vue 3中,当使用 vfor 渲染元素列表时,默认采用“就地更新”策略。如果数据项的顺序被更改,Vue 3 将不会移动页面元素来匹配数据项的顺序,而是就地更新每个元素,并确保它们在每个索引位置都被正确渲染。为了告知 Vue 3 每个节点的身份,以便能够重用和重新排序现有元素,需要为每个项提供一个唯一的 key 值,建议在使用 vfor时尽可能提供 key 值,这样可以提高 vfor 的渲染效率,代码如下:
3.2.2数组更新
Vue 3的核心是数据与视图的双向绑定,为了监测数组中元素的变化并及时将变化反映到视图中,Vue 3对以下7个数组变更函数进行了封装。
(1) push()。
(2) pop()。
(3) shift()。
(4) unshift()。
(5) splice()。
(6) sort()。
(7) reverse()。
使用浏览器打开3.2.1节中的页面,在开发者工具中切换到控制台窗口,然后输入以下命令:
vm.items.push({ message: 'Baz' });
数组更新的结果如图3.5所示。
图3.5数组更新的结果
上述的push()函数会改变参数中的原始数组。此外,JavaScript语言也有原生数组的非变更函数,如filter()、concat()和slice(),它们不会改变原始数组,而是返回一个新数组。当使用非变更函数时,可以用新数组替换旧数组,代码如下:
vm.items = vm.items.filter(item => item.message.match(/Foo/));
数组变更的结果如图3.6所示。
图3.6数组变更的结果
有些开发者担心这种操作会造成性能问题,实际上这种操作并不会导致Vue 3丢弃现有的页面元素并重新渲染整个列表。Vue 3为了使页面元素得到最大范围的重用而进行了针对性的优化,用一个含有相同元素的数组去替换原来的数组是非常高效的操作。
3.2.3vfor的其他操作
vfor可以用来显示数组过滤或排序后的结果,如果要显示一个数组经过过滤或排序后的版本,而不改变原始数据,可以创建一个计算属性来返回处理后的数组,代码如下:
{{ n }}
如果在嵌套的 vfor 循环中无法使用计算属性,可以使用methods()函数来解决,代码如下:
vfor 也可以接受整数n作为迭代参数,在这种情况下模板会重复循环n次,代码如下:
{{ n }}
页面渲染结果如图3.7所示。
图3.7vfor接受整数的页面渲染结果
和 vif类似,开发者也可以利用带有 vfor 的 来循环渲染一段包含多个元素的内容,代码如下:
当vfor与vif同时使用时,需要注意当它们处于同一节点时,vif的优先级比vfor更高,这意味着vif将没有权限访问vfor中的变量,代码如下:
{{ todo.name }}
为了解决这个问题,可以把 vfor 移动到 标签中来修正,代码如下:
{{ todo.name }}
在自定义组件上,开发者可以像在任何普通元素上一样使用 vfor,代码如下:
然而,任何数据都不会被自动传递到组件里,因为组件有自己独立的作用域。为了把迭代数据传递到组件里,需要使用如“: props名称”的组件属性来传递数据,代码如下:
视频讲解
3.3数据绑定指令vbind
vbind的主要作用是动态更新HTML元素上的属性和动态绑定组件的props属性,也可以使用简写的符号“:”来代替它。
3.3.1参数与属性绑定
下面示例中链接的href属性通过vbind动态地设置,当数据发生变化时,组件会被重新渲染,代码如下:
3.3.2动态绑定
示例代码如下:
与3.3.1节中的代码相比,此处将在HTML中的属性变成了动态获取。vbind还可以直接绑定一个包含属性名和值的对象。在这种情况下,vbind指令不需要接收参数就可以直接使用,代码如下:
最终的渲染结果如图3.8所示。
图3.8vbind绑定对象的渲染结果
3.3.3vbind的缩写及合并行为
Vue 3提供了一个简写方式“:bind”,如果一个元素同时定义了 vbind="object" 和一个相同的独立属性,后定义的属性值会覆盖之前定义的同名属性值。因此开发者可以通过控制它们的合并行为以满足开发需求,代码如下:
3.4vmodel与表单
3.4.1基本用法
vmodel用于在表单中的、