2021-08-30 使用vue的v-for进行遍历时为什么要为遍历元素加上key?为什么不推荐数组的index当做key使用?

本文详细介绍了在Vue中使用v-for指令时,未添加key可能出现的问题,如状态复用导致的显示错误。通过示例展示了添加key值(特别是以item.id作为key)如何解决这个问题,以及为何这样做可以提高渲染性能。同时,讨论了使用数组索引index作为key的潜在影响,特别是在数据动态增删时。最后,强调了key值的选取原则和注意事项,提醒开发者遵循最佳实践来优化Vue应用的性能。

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

1.在vue中使用v-for,未添加key时可能会出现的问题
示例
  • html:
<div id="app">
	  <!-- 1.v-for不加key -->
	  <!-- 遍历输出书籍 -->
	  <div class="book" v-for="(item,index) in mybooks">
	    <input type="checkbox">我有哪些书:{{item.name}}
	  </div>
	  <!-- 点击添加书籍 -->
	  <div>
	    <input type="text"  v-model="name" placeholder="添加书籍">
	    <button @dblclick="add">点击添加</button>
	  </div>
	</div>
</div>
  • script:
new Vue({
  el:"#app",
  data:{
    mybooks:[
      {id:1,name:"呐喊"},
      {id:2,name:"活着"},
      {id:3,name:"飘"}
    ],
    id:3,
    name:""
  },
  methods:{
    add(){
      this.mybooks.unshift({id:++this.id,name:this.name});//把新元素添加进入数组开头
      this.name="";//清空input框
    }
  }
});
  • 效果:
    添加前:选择一个复选框
    在这里插入图片描述
    添加后:选择的复选框变成了另一本书

在这里插入图片描述

出现的原因

v-for中没有key时,会默认使用"就地复用"的策略,当数据项的顺序被改变,vue不是移动DOM元素来匹配新位置,而是简单复用原先位置的每个元素,这就会导致上面示例的情况
可以理解为:
没有key属性,状态默认绑定的是位置,有key时,状态根据key值绑定到相应的数组元素上

2.v-for加上key,并以item作为唯一key值
代码
  • html
 <!-- 2.v-for加上key -->
 <div>
 <!-- 加了唯一性的key后,id的checkbox跟内容进行了一个关联-->
   <div class="book" v-for="(item,index) in mybooks" :key="item.id">
   <input type="checkbox">我有哪些书:{{item.name}}
 </div>
 <div>
   <input type="text"  v-model="name" placeholder="添加书籍">
   <button @dblclick="add">点击添加</button>
</div>
  • 效果
    添加前
    在这里插入图片描述
    添加后
    在这里插入图片描述

发现复选框对应的书籍没有发生改变,取得我们想要的效果

v-for为什么要加上key?

v-for中添加key可以让每个循环出来的DOM添加唯一标识,从而高效地更新虚拟DOM,
可以快速找到节点,减少渲染次数,提高渲染性能

它的底层原理是这样的:
	1.不加key的时候,每次操作DOM都会重新销毁和生成新DOM,这样会使性能消耗极大,
	2.而加的key如果不是唯一标识(比如使用的是index而不是item),
则会导致内部复用错误的组件和DOM
	3.添加正确的key后,由于vue的源码是内部数据驱动,通过改变数据来改变视图,
加上key之后,更容易定位到相应的元素,避免遍历DOM造成的性能消耗
注意事项
  • key的取值必须是number 或 string,不能是对象,而且使用 v-for 循环的每一项的值,都要保证唯一性
  • 理论上,不操作dom的时候就可以用index做key,或者不添加key,但是处于代码规范,开发者应自觉使用唯一标识作为key值
3.v-for的key值使用数组的索引index会造成什么影响?
原因

一旦删除或添加一个数据,这个数据之后的所有数据下标值都会被改变,
导致以前的数据和重新渲染后的数据随着 key 值的变化没法建立关联关系.
这就失去了 key 值存在的意义

例子

场景:使用v-for把一个数组渲染到页面上,使用数组下标作为key值
需求:点击一个复选框选中它,然后删除它
结果:被选中的元素虽然删除了,但他后面的元素的复选框被自动选中了
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端OnTheRun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值