都2024了,你不会还以为 index 不能做 key 吧?

vue3:key 可以使用用 index 了

本来以为大家都知道这事了,结果,看了最新的一个文章以及评论,发现一些人还以为 index 不能作为 key。这...尤雨溪是白做优化了。

先看看最新官网

cn.vuejs.org/guide/essen...

html 复制代码
<li v-for="item in items">
  {{ item.message }}
</li>

<li v-for="(item, index) in items">
  {{ parentMessage }} - {{ index }} - {{ item.message }}
</li>

有没有发现不一样的地方?居然没有key了!

再来看看关于 key 的说明------通过 key 管理状态:

Vue 默认按照"就地更新"的策略来更新通过 v-for 渲染的元素列表。当数据项的顺序改变时,Vue 不会随之移动 DOM 元素的顺序,而是就地更新每个元素,确保它们在原本指定的索引位置上渲染。

动手试试

官网这么写了就一定没有问题吗?不要迷信官网,要自己动手试试才行,我们先做个简单的例子。

js:

定义一个数组

js 复制代码
  const a = [
    'A',
    'B',
    'C',
    'D'
  ]
  const list = reactive([...a])

设置几个按钮事件:

js 复制代码
  //删除一个数组元素
  const del1 = (index: number) => {
    list.splice(index, 1)
  }

  let index = 0
  // 重新设置数组内容
  const reset1 = () => {
    index = 0
    list.length = 0
    list.push(...a)

  }
  // 在开头添加一个元素
  const addNewA = () => {
    list.unshift('aa' + index++)
  }
  // 在结尾添加一个元素
  const addNewZ = () => {
    list.push('zzz' + index++)
  }
  // 交换位置
  const update2 = () => {
    const tmp = list.splice(2,1)
    list.splice(1,0, tmp[0])
  } 

不用 key

我们对原生dom、template、自定义组件使用v-for进行测试,先按照官网不设置key:

html 复制代码
  原生dom:
  <div v-for="(item, index) in list">
    {{ index }}:{{ item }}
    <button @click="del1(index)">X</button>
  </div>
  <hr>
  template:<br>
  <template v-for="(item, index) of list" >
    {{ index }}:{{ item }}
    <button @click="del1(index)">X</button>
    <br>
  </template>
  <hr>
  <key-son
    v-for="(item) in list"
    :name="item"
  >
  </key-son>

index 作为 key

然后再使用 index 作为 key:

html 复制代码
  <div
    v-for="(item, index) in list"
    :key="index"
  >
    {{ index }}:{{ item }}
    <button @click="del1(index)">X</button>
  </div>
  <hr>
、<template
    v-for="(item, index) of list"
    :key="index"
  >
    {{ index }}:{{ item }}
    <button @click="del1(index)">X</button>
    <br>
  </template>
  <hr>
  <key-son
    v-for="(item) in list"
    :key="index"
    :name="item"
  >
  </key-son>

测试

经过反复测试,完全没有问题。不截图了,反正也不好看。

小结

  • 一般情况下完全可以不设置key,这样效率更高。
  • 如果要使用key的话,index也是可以的。
  • 如果还是不放心的话,使用啥都行。
相关推荐
leoZ2316 小时前
Claude 驱动的全栈开发:Spring Boot + Vue 的 BS 架构实践
vue.js·spring boot·架构
荒诞英雄9 小时前
从 17MB Vendor 大包到按需加载:Vite 多入口 Vue 组件库首屏优化实践
vue.js·vite
jsonbro9 小时前
手把手带你实现发布订阅模式
前端·vue.js·设计模式
Cobyte11 小时前
23.Vue Vapor 组件 attrs 的实现
前端·javascript·vue.js
斯特凡今天也很帅12 小时前
xml页面可以打开,不报错,但是显示数据的地方也不显示,我是怎么解决的
xml·vue.js
柯克七七14 小时前
给老项目加了 TypeScript,本来只想自己爽,结果全公司代码审查标准被我抬高了
前端·vue.js·typescript
自然 醒16 小时前
前端如何实现在线预览office常见文件功能?
前端·vue.js
肉肉不吃 肉16 小时前
前端调试跨域如何解决
前端·vue.js
卓怡学长16 小时前
w268基于springboot + vue 物流系统
java·数据库·vue.js·spring boot·spring·intellij-idea
2601_9628517417 小时前
计算机毕业设计之基于SSM的网络安全课程资源分享平台
vue.js·算法·安全·web安全·yolo·目标检测·课程设计