首页 > 编程笔记 > JavaScript笔记
阅读:63
Vue v-for用法详解(附带实例)
在网页中,列表是一种非常常见的组件。在列表中,每一行元素都有相似的 UI,只是其填充的数据有所不同,使用 Vue 中的循环渲染指令,我们可以轻松地构建出列表视图。
在 v-for 指令中,item 是一个临时变量,它是列表中被迭代出的元素,list 是列表变量本身。我们可以新建一个名为 4.for.html 的测试文件,在其 body 标签中编写如下核心代码:

图 1 循环渲染效果图
更多时候,我们需要渲染的数据都是对象数据,使用对象来对列表元素进行填充,例如定义联系人对象列表如下:
修改要渲染的 HTML 标签结构如下:

图 2 使用对象数据进行循环渲染
在 v-for 指令中,我们也可以获取到当前遍历项的索引,示例如下:
在上述代码中,v-for 指令遍历的是列表,实际上我们也可以对一个 JavaScript 对象进行 v-for 遍历。在 JavaScript 中,列表本身也是一种特殊的对象,我们使用 v-for 遍历对象时,指令中的第 1 个参数为遍历的对象中的属性的值,第 2 个参数为遍历的对象中的属性的名字,第 3 个参数为遍历的索引。首先,定义对象如下:
我们使用有序列表来承载 preson 对象的数据,代码如下:

图 3 将对象数据渲染到页面上
需要注意,在使用 v-for 指令进行循环渲染时,为了更好地对列表项进行重用,我们可以将其 key 属性绑定为一个唯一值,代码如下:
首先在页面上添加一个按钮来演示列表逆序操作。
定义 Vue 组件方法如下:
在实际开发中,原始的列表数据往往并不适合直接渲染到页面上,v-for 指令支持在渲染前对数据进行额外的处理,修改标签如下:
在上述代码中,handle 为定义的处理函数,在进行渲染前,会通过这个函数对列表数据进行处理。例如,我们可以使用过滤器对列表数据进行过滤渲染,实现 handle 函数如下:
当需要同时循环渲染多个元素时,与 v-if 指令类似,最常用的方式是使用 template 标签进行包装,例如:
如果只是需要让某个元素重复渲染,不依赖具体数据,v-for 指令遍历的对象也支持设置为数值,代码如下:
另外,当在同一个标签上使用 v-for 与 v-if 指令时,v-if 指令的优先级更高。也就是说,v-if 指令中不可以使用 v-for 遍历出的数据,例如下面的代码是错误的:
Vue v-for指令的使用方法
在 Vue 中,v-for 指令可以将一个数组中的数据渲染为列表视图。v-for 指令需要设置为一种特殊的语法,其格式如下:item in list在上面的格式中,in 为语法关键字,也可以替换为 of。
在 v-for 指令中,item 是一个临时变量,它是列表中被迭代出的元素,list 是列表变量本身。我们可以新建一个名为 4.for.html 的测试文件,在其 body 标签中编写如下核心代码:
<body> <div id="Application"> <div v-for="item in list"> {{ item }} </div> </div> <script> const { createApp, ref } = Vue; const config = { setup() { const list = ref([1, 2, 3, 4, 5]); // 定义一个 list 列表数据 return { list }; } }; createApp(config).mount('#Application'); </script> </body>运行代码,可以看到网页中正常渲染出了 5 个 div 组件:

图 1 循环渲染效果图
更多时候,我们需要渲染的数据都是对象数据,使用对象来对列表元素进行填充,例如定义联系人对象列表如下:
const list = ref([ {name: "Lili", num: "151xxxxxxxx"}, {name: "Jaki", num: "151xxxxxxxx"}, {name: "Lucy", num: "151xxxxxxxx"}, {name: "Monki", num: "151xxxxxxxx"}, {name: "Bei", num: "151xxxxxxxx"} ])
修改要渲染的 HTML 标签结构如下:
<div id="Application"> <ul> <li v-for="item in list"> <div>{{ item.name }}</div> <div>{{ item.num }}</div> </li> </ul> </div>运行代码,效果如下图所示:

图 2 使用对象数据进行循环渲染
在 v-for 指令中,我们也可以获取到当前遍历项的索引,示例如下:
<ul> <li v-for="(item, index) in list"> <div>{{ index + "." + item.name }}</div> <div>{{ item.num }}</div> </li> </ul>需要注意,index 索引的取值是从 0 开始的。
在上述代码中,v-for 指令遍历的是列表,实际上我们也可以对一个 JavaScript 对象进行 v-for 遍历。在 JavaScript 中,列表本身也是一种特殊的对象,我们使用 v-for 遍历对象时,指令中的第 1 个参数为遍历的对象中的属性的值,第 2 个参数为遍历的对象中的属性的名字,第 3 个参数为遍历的索引。首先,定义对象如下:
const preson = ref({ name: "Lili", age: "00", num: "151xxxxxxxx", emali: "xxxx@xx.com" })
我们使用有序列表来承载 preson 对象的数据,代码如下:
<ol> <li v-for="(value, key, index) in person"> {{ key }}: {{ value }} </li> </ol>运行代码,效果如下图所示:

图 3 将对象数据渲染到页面上
需要注意,在使用 v-for 指令进行循环渲染时,为了更好地对列表项进行重用,我们可以将其 key 属性绑定为一个唯一值,代码如下:
<ol> <li v-for="(value, key, index) in person" :key="index"> {{ key }}: {{ value }} </li> </ol>当列表数据发生修改时,Vue 默认采用“就地更新”的策略来更新页面上的元素。为列表中的每个元素指定一个唯一的 key 值可以帮助 Vue 更高效地追踪和重用节点,从而提高更新性能。
Vue v-for指令的高级用法
当我们使用 v-for 对列表进行循环渲染后,实际上就实现了对这个数据对象的绑定。当我们调用下面这些函数对列表数据对象进行更新时,视图也会对应地更新:push() // 向列表尾部追加一个元素 pop() // 删除列表尾部的一个元素 shift() // 删除列表头部的一个元素 unshift() // 向列表头部插入一个元素 splice() // 对列表进行分割操作 sort() // 对列表进行排序操作 reverse() // 对列表进行逆序操作
首先在页面上添加一个按钮来演示列表逆序操作。
<button @click="click"> 逆序 </button>
定义 Vue 组件方法如下:
const click = () => { list.value.reverse() }运行代码,可以看到当单击页面上的按钮时,列表元素的渲染顺序会进行正逆切换。当我们需要对整个列表都进行替换时,直接将列表变量重新赋值即可。
在实际开发中,原始的列表数据往往并不适合直接渲染到页面上,v-for 指令支持在渲染前对数据进行额外的处理,修改标签如下:
<ul> <li v-for="(item, index) in handle(list)"> <div>{{ index + "." + item.name }}</div> <div>{{ item.num }}</div> </li> </ul>
在上述代码中,handle 为定义的处理函数,在进行渲染前,会通过这个函数对列表数据进行处理。例如,我们可以使用过滤器对列表数据进行过滤渲染,实现 handle 函数如下:
const handle = (l)=> { return l.filter(obj => obj.name != "珲少") }
当需要同时循环渲染多个元素时,与 v-if 指令类似,最常用的方式是使用 template 标签进行包装,例如:
<template v-for="(item,index) in handle(list)"> <div>{{index + "." + item.name}}</div> <div>{{item.num}}</div> </template>
如果只是需要让某个元素重复渲染,不依赖具体数据,v-for 指令遍历的对象也支持设置为数值,代码如下:
<div v-for="n in 5"> 重复次数:{{n}} </div>
另外,当在同一个标签上使用 v-for 与 v-if 指令时,v-if 指令的优先级更高。也就是说,v-if 指令中不可以使用 v-for 遍历出的数据,例如下面的代码是错误的:
<div v-for="n in 5" v-if="n!=3"> 重复次数:{{n}} </div>