vue遍历中key详解 (Demo案例)

举报
辰兮 发表于 2022/03/23 01:04:38 2022/03/23
【摘要】 【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、...

【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!

博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!

吾等采石之人,应怀大教堂之心,愿你们奔赴在各自的热爱中…


一、key序言

做vue项目,之前做到关于遍历数组对象找那个的数组,里面涉及到key,现抽时间和大家一起学习一下相关的内容。

vue遍历数组对象中的数组集合(Demo案例)

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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。