vue组件中不绑定 vs绑定key的细节分析

本文探讨了Vue中key值对于组件性能的影响。通过对比分析不绑定key、以数组索引为key以及使用稳定id为key的情况,揭示了key在不同场景下的作用。当数据量大时,使用稳定id作为key可以显著提高性能,避免不必要的DOM更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于 Vue中key能优化性能的一点理解。
先上代码,方便理解。

<template>
  <div id="app">
    <h4>不绑定key</h4>
    <div v-for="item in arr1">{{item}}</div>
    <h4>用数组索引绑定key</h4>
    <div v-for="(item,index) in arr2" :key="index">{{item}}</div>
    <h4>用稳定的id绑定key</h4>
    <div v-for="item in arr3" :key="item.id">{{item.val}}</div>
  </div>
</template>

<script>
export default {
  name: 'App',
  data(){
    return{
      arr1:[1,2,3,4],
      arr2:[5,6,7,8],
      arr3:[
        {id:9,val:9},
        {id:10,val:10},
        {id:11,val:11},
        {id:12,val:12}
        ]
    }
  },  
}
</script>

下图是dom树的结构:
dom树结构

① arr1 不绑定key值:
此时我们在arr1渲染完成的节点上增加一个自定义的属性 render = ‘{渲染的值}’。
如下图:
在这里插入图片描述
当我们在数组的2和3之间插入一个元素666,此时dom结构的变动如下图:
在这里插入图片描述
如上图所示,我们插入的666替换了本来内容为3的节点的文本,下面的节点重复这个过程。最后新增了一个div元素,内容为4。
这就是vue的就近更新策略。

② arr2 以数组索引为 key 的情况分析:
我们继续上面的过程,在arr2渲染的元素上新增我们用来识别的属性 render,如下图:
在这里插入图片描述
此时我们在数组的6和7之间插入666,dom的结构变动如图所示:
在这里插入图片描述
根据上图的情况,我们可以清晰地观察到跟情况①一模一样。如果使用索引作为key值,因为索引是动态的,插入一个元素,从插入的地方到数组的尾部依次更新,插入的前面不做变化。如果没有较好的选择,可以使用索引作为key,一般不建议使用。应该用一个稳定的id值来作为key,那就是下面的情况。

③ arr3 使用id值作为key的情况分析:
还是老规矩,给每个arr3迭代的元素加一个自定义的render属性来观察变化:
在这里插入图片描述
此时我们在10和11之前插入666,观察之后的dom结构变化:
在这里插入图片描述
如上图所示,在正确的位置插入了我们新增的节点,切之前的节点并没有改变。这就是使用稳定的key值的性能提升。

总结:当数据量很小时,如果没有稳定的id,我们可以将就用索引作为key值,当数据量很大时,必须指定唯一的id来优化性能,方便vue快速的找到改动的地方来响应变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值