Vue中的v-for为什么要添加唯一的key属性,作用解答
发布日期:2021-06-30 11:55:15 浏览次数:3 分类:技术文章

本文共 1945 字,大约阅读时间需要 6 分钟。

没有key

  • {
    {item.name}}

当选中吕不为时,添加楠楠后选中的确是李斯,并不是我们想要的结果,我们想要的是当添加楠楠后,一种选中的是吕不为

 

有key

  • {
    {item.name}}

同样当选中吕不为时,添加楠楠后依旧选中的是吕不为。

 

可以简单的这样理解:加了key(一定要具有唯一性) id的checkbox跟内容进行了一个关联。是我们想达到的效果

查过相关文档,图例说明很清晰。

vue和react的虚拟DOM的Diff算法大致相同,其核心是基于两个简单的假设

首先讲一下diff算法的处理方法,对操作前后的dom树同一层的节点进行对比,一层一层对比,如下图:

当某一层有很多相同的节点时,也就是列表节点时,Diff算法的更新过程默认情况下也是遵循以上原则。

比如一下这个情况:

我们希望可以在B和C之间加一个F,Diff算法默认执行起来是这样的:

即把C更新成F,D更新成C,E更新成D,最后再插入E,是不是很没有效率?

所以我们需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。

vue中列表循环需加:key="唯一标识" 唯一标识可以是item里面id index等,因为vue组件高度复用增加Key可以标识组件的唯一性,为了更好地区别各个组件 key的作用主要是为了高效的更新虚拟DOM

总结 

简单地理解,无:key属性时,状态默认绑定的是位置;有:key属性时,状态根据key的属性值绑定到了相应的数组元素

提高渲染的效率,避免非最后插入数据造成后面的数据都重新渲染

一般推荐使用数组内的字段(保证唯一性)做为key的唯一标识,不推荐直接使用循环的index属性作为key标识

此时更新渲染数据,通过index定义的key去进行前后数据的对比,发现

之前的数据                         之后的数据key: 0  index: 0 name: test1     key: 0  index: 0 name: test1key: 1  index: 1 name: test2     key: 1  index: 1 name: 我是插队的那条数据key: 2  index: 2 name: test3     key: 2  index: 2 name: test2                                 key: 3  index: 3 name: test3

 通过上面清晰的对比,发现除了第一个数据可以复用之前的之外,另外三条数据都需要重新渲染;

是不是很惊奇,我明明只是插入了一条数据,怎么三条数据都要重新渲染?而我想要的只是新增的那一条数据新渲染出来就行了

最好的办法是使用数组中不会变化的那一项作为key值,对应到项目中,即每条数据都有一个唯一的id,来标识这条数据的唯一性;使用id作为key值,我们再来对比一下向中间插入一条数据,此时会怎么去渲染

之前的数据                               之后的数据key: 1  id: 1 index: 0 name: test1     key: 1  id: 1 index: 0  name: test1key: 2  id: 2 index: 1 name: test2     key: 4  id: 4 index: 1  name: 我是插队的那条数据key: 3  id: 3 index: 2 name: test3     key: 2  id: 2 index: 2  name: test2                                       key: 3  id: 3 index: 3  name: test3

现在对比发现只有一条数据变化了,就是id为4的那条数据,因此只要新渲染这一条数据就可以了,其他都是就复用之前的; 

 总结 :所以一句话,key的作用主要是为了高效的更新虚拟DOM。另外vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果。

 

 

 

 

 

转载地址:https://jackiehao.blog.csdn.net/article/details/114364053 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:常见的9种前端跨域解决方案详解
下一篇:小程序常见面试题

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月23日 18时45分30秒