背景介绍

在一次Vue项目中,由于急需处理了一个循环渲染组件的Demo,由于循环的数据没有唯一标识,所以在循环中key使用的是index(虽然以前就得知Vue循环中建议使用唯一属性作为key,但是头铁不想额外对数据增加唯一标识,简称懒),完成后由于时间问题还在来得及进行测试就提交了演示,结果组件的内部状态没有正确更新,造成了笑话

演示结束了回来复盘时发现是因为使用index作为key造成的问题,故此记录一篇文章,用做日后警示


说明

在 Vue 中,v-for 指令用于渲染列表,key 属性在其中起着关键作用,key 是 Vue 用来识别节点的唯一标识。在渲染和更新过程中,Vue 使用 key 来追踪节点,使得元素的重用和重新排序更加高效


错误示例

<template>
  <div v-for="(item, index) in items" :key="index">
    <MyComponent :item="item" />
  </div>
  <button @click="test">test</button>
</template>

当上述的按钮函数改变了items的index(索引)或者中间插入时额外的item时,Vue将认为旧的节点可以复用并仅更新其内容,因为key值没有变(即索引仍然对应相同的位置),这可能导致状态管理的问题

并且当MyComponent有内部状态,这些状态可能不会像预期那样重置或保留。同时Vue也会基于index去尝试匹配已有的DOM节点,这可能会导致视觉上的混乱,因为组件的内部状态可能不再与新的数据相匹配


缺点分析

  1. index(索引)不稳定

数据变动:当数组中的元素被插入、删除或重新排序时,索引会发生变化。这会导致Vue在更新DOM时无法正确地识别和复用已有的组件
数据来源:如果数据来自于外部API或用户输入,索引可能会因为数据更新而改变,从而影响到组件的稳定性

  1. 影响性能

重新渲染:当索引变化时,Vue会认为整个循环内容都需要重新渲染,因为它无法确定哪些元素是新添加的,哪些是已有的。这会导致不必要的DOM操作,影响性能
虚拟DOM比较:众所周知Vue使用虚拟DOM来高效地更新真实DOM。使用不稳定的key会增加虚拟DOM比较的复杂性,从而降低性能

  1. 错误复用组件

状态混乱:如果使用索引作为key,当数据顺序改变时,组件可能会复用错误的状态。例如,一个输入框可能会显示错误的值,导致用户体验下降
事件监听:事件监听器可能会绑定到错误的组件上,导致点击、输入等事件无法正确响应


结语

  • 在Vue循环中如果不对循环中内容(v-for)进行修改,那么不写key或者使用index作为key其实也没有关系,或者说,只要页面中的循环中内容(v-for)不需要更新,有没有这个key或者这个key是shui应该都是无所谓的。但是如果循环中内容(v-for)需要修改,那么必须要给每个item配置独一无二的key,以提高页面的性能,同时也不会导致列内容渲染和更新不正确
  • 在Vue循环中使用index作为key会导致索引不稳定、影响性能和错误复用组件的问题。为了避免这些问题,建议使用数据中的唯一标识符作为key。通过这样做,可以确保组件状态和DOM的一致性,提升应用性能,并减少调试难度
Last modification:December 5, 2024
如果觉得我的文章对你有用,您可以给博主买一杯果汁,谢谢!