你该不会还不知道v-for中 key的作用和原理吧?

文章讲述了Vue和React中虚拟DOM的Diff算法如何处理列表节点,强调了在列表渲染时使用唯一标识(如item.id)的key的重要性,以提高性能并确保只有真正需要更新的部分被重新渲染。作者还提到了在不同数据更新场景下的最佳实践,尤其是使用稳定的ID作为key避免不必要的渲染开销。
摘要由CSDN通过智能技术生成

<button @click=“add”>添加

    • {{item.name}}

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

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

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

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

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

      before.png

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

      比如一下这个情况:

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

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

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

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

      使用v-for更新已渲染的元素列表时,默认用就地复用策略;列表数据修改的时候,他会根据key值去判断某个值是否修改,如果修改,则重新渲染这一项,否则复用之前的元素;

      我们在使用的使用经常会使用index(即数组的下标)来作为key,但其实这是不推荐的一种使用方法;

      举个???

      const list = [

      {

      id: 1,

      name: ‘test1’,

      },

      {

      id: 2,

      name: ‘test2’,

      },

      {

      id: 3,

      name: ‘test3’,

      },

      ]

      {{item.name}}

      上面这种是我们做项目中常用到的一种场景,因为不加key,vue现在直接报错,所以我使用index作为key;下面列举两种常见的数据更新情况

      1.在最后一条数据后再加一条数据

      const list = [

      {

      id: 1,

      name: ‘test1’,

      },

      {

      id: 2,

      name: ‘test2’,

      },

      {

      id: 3,

      name: ‘test3’,

      },

      {

      id: 4,

      name: ‘我是在最后添加的一条数据’,

      },

      ]

      此时前三条数据直接复用之前的,新渲染最后一条数据,此时用index作为key,没有任何问题;

      2.在中间插入一条数据

      const list = [

      {

      id: 1,

      name: ‘test1’,

      },

      {

      id: 4,

      name: ‘我是插队的那条数据’,

      }

      {

      id: 2,

      name: ‘test2’,

      },

      {

      id: 3,

      name: ‘test3’,

      },

      ]

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

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

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

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

      自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

      深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

      因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

      img

      既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

      由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

      如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

      最后

      一个好的心态和一个坚持的心很重要,很多冲着高薪的人想学习前端,但是能学到最后的没有几个,遇到困难就放弃了,这种人到处都是,就是因为有的东西难,所以他的回报才很大,我们评判一个前端开发者是什么水平,就是他解决问题的能力有多强。

      分享一些简单的前端面试题以及学习路线给大家,狂戳这里即可获取!!!

      较高,非无偿)**

      最后

      一个好的心态和一个坚持的心很重要,很多冲着高薪的人想学习前端,但是能学到最后的没有几个,遇到困难就放弃了,这种人到处都是,就是因为有的东西难,所以他的回报才很大,我们评判一个前端开发者是什么水平,就是他解决问题的能力有多强。

      分享一些简单的前端面试题以及学习路线给大家,狂戳这里即可获取!!!

      [外链图片转存中…(img-eOFlI6kF-1711675086758)]

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值