vue遍历中key详解 (Demo案例)
【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!
博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!
吾等采石之人,应怀大教堂之心,愿你们奔赴在各自的热爱中…
一、key序言
做vue项目,之前做到关于遍历数组对象找那个的数组,里面涉及到key,现抽时间和大家一起学习一下相关的内容。
Vue 很大的一个特点就是双向数据绑定,数据一旦改变,那么页面就渲染新的数据呈现在页面上。
如果用某一个使用v-for 渲染的列表,数据量庞大,同时增删改操作频繁,每一次的操作都要重新渲染,是不是显得很不友好。
如果列表修改一条数据,页面仅仅只是对这个数据进行渲染,那整体的效率不就提高了很多。key的出现就是为了解决这样的问题。
官方推荐我们在使用v-for时,给对应的元素或组件添加上一个:key属性。
给每一个节点做一个唯一标识 diff算法可以正确的识别此节点 key的作用主要是为了高效的更新虚拟DOM。
二、key讲解
vue遍历中的key讲解
<!-- 注意: key 在使用的时候,必须使用 v-bind 属性绑定的形式,指定 key 的值 -->
<!-- key使用案例如下 -->
<ul>
<li v-for="item in items" :key="item.id">...</li>
</ul>
- 1
- 2
- 3
- 4
- 5
key 的特殊属性主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes。如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试修复/再利用相同类型元素的算法。使用 key,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。
就是说,key值的存在保证了唯一性,可以用于dom的重新渲染或是就地复用。
- v-for 循环的时候,key属性只能使用number或者string
- key在使用的时候,必须使用v-bind 属性绑定的形式来指定key的值
<div id="app">
<div v-for="i in arrList">{{ i }}</div>
</div>
- 1
- 2
- 3
var vm = new Vue({
el: '#app',
data: {
arrList: [1, 2, 3, 4, 5]
}
})
- 1
- 2
- 3
- 4
- 5
- 6
以上例子会渲染出5个dom节点,我们分别给每个增加一个id值,也就是key,如下:
[
'<div>1</div>', // id: A
'<div>2</div>', // id: B
'<div>3</div>', // id: C
'<div>4</div>', // id: D
'<div>5</div>' // id: E
]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
我们改变arrList的数据使dom进行变化
// 数据位置替换 更新一下原数组的值
vm.arrList= [4, 1, 3, 5, 2]
// 没有key的情况, 节点位置不变,但是节点innerText内容更新了
[
'<div>4</div>', // id: A
'<div>1</div>', // id: B
'<div>3</div>', // id: C
'<div>5</div>', // id: D
'<div>2</div>' // id: E
]
// 有key的情况,dom节点位置进行了交换,但是内容没有更新
// <div v-for="i in arrList" :key='i'>{{ i }}</div>
[
'<div>4</div>', // id: D
'<div>1</div>', // id: A
'<div>3</div>', // id: C
'<div>5</div>', // id: E
'<div>2</div>' // id: B
]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
vue在执行时,会对节点进行检查,如果没有key值,那么,vue检查到这里有dom节点,则会对内容进行清空,并且赋予新值;如果有key值的存在,那么vue会对oldnode和newnode进行对比,发现两者key值是否相同,进行调换位置或是删除操作。
基于上述说法,不得不说,编写key值和不编写key值在时间上一定会有所差异(有key值的速度相对慢,但属于用户无法感知到),但时间上的快慢不属于key值的作用。
key值的作用是:
更精准的在虚拟dom节点中赋予key值,会更加快速的拿到需要的目标节点,不会造成就地复用的情况,对于节点的把控更加精准。
此时如果arrList: [1, 2, 3, 4, 5]变成了[0, 1, 2, 3, 4, 5],渲染输出的更新步骤就变化了:
在有了key属性之后,Vue会记住元素们的顺序,并根据这个顺序在适当的位置插入/删除元素来完成更新,这种方法比没有key属性时的就地复用策略效率更高。
总体来说,当使用列表渲染时,永远添加key属性,这样可以提高列表渲染的效率,提高了页面的性能。
三、key拓展
备注:不建议使用索引作为key,可以使用唯一id作为key
原因:如果在一个数组中插入某一个值,vue识别后会从新分配后续索引,速度变慢
之前的数据 之后的数据
key: 0 index: 0 name: A key: 0 index: 0 name: A
key: 1 index: 1 name: B key: 1 index: 1 name: 新增数据
key: 2 index: 2 name: C key: 2 index: 2 name: B
key: 3 index: 3 name: C
- 1
- 2
- 3
- 4
- 5
- 6
对比发现除了第一个数据可以复用之前的之外,另外三条数据都需要重新渲染
之前的数据 之后的数据
key: 1 id: 1 index: 0 name: A key: 1 id: 1 index: 0 name: A
key: 2 id: 2 index: 1 name: B key: 4 id: 4 index: 1 name: 新增数据
key: 3 id: 3 index: 2 name: C key: 2 id: 2 index: 2 name: B
key: 3 id: 3 index: 3 name: C
- 1
- 2
- 3
- 4
- 5
- 6
对比一下就是复用三个,然后新增一个id为4的
总结:有效合理的利用key属性,可以提高列表渲染的效率,提高了页面的性能。
非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤️ 分享👥 留言💬thanks!!!
2021年2月19日22:08:54 愿你们奔赴在自己的热爱里!
文章来源: blessing.blog.csdn.net,作者:辰兮要努力,版权归原作者所有,如需转载,请联系作者。
原文链接:blessing.blog.csdn.net/article/details/113872849
- 点赞
- 收藏
- 关注作者
评论(0)