首页 > 其他分享 >vue v-for中key的作用,使用index作为key会怎么样?

vue v-for中key的作用,使用index作为key会怎么样?

时间:2024-04-21 18:34:11浏览次数:14  
标签:index vue 渲染 元素 list 更新 item key

原理

  其主要的目的就是优化性能。vue在更新dom时会比较key值相同的元素内容是否发生改变,如果不变则不更新页面,这样可以使得尽可能减少页面的更新,提高性能。假如我渲染3个元素,不设置key值,即默认策略应该是标识为index,即0,1,2。假如我在第一个元素后加一个元素,则实际上原先的bc元素都被改值了,变成了xb。
  假如我们在添加元素前把b这个item添加为全局变量,然后按下按钮添加元素,发现其没有被销毁,而是重新渲染了值为x,除了第一个元素其余元素都渲染了一遍。
  如果每个item都有一个唯一的key,那么在数据改变时,vue只需要渲染那个新增的item。也就是说,理想情况下,某个元素的key值是不能被改变的,否则其会以更新后key值为1的x来更新原先key值为1的b。详细来说就是,bc被更新成xb,然后添加了一个key值为3的c。除了a,渲染了三个元素。而如果将key值确定,则同一个的key的数据没有进行更新,vue也就不会重新渲染。abc到axbc的过程中,只渲染了x这一个元素,从而提高了性能。
假设我们要在第一个元素后面加一个元素,

写法

假如我list内部有3个元素,其内容也很简单,就叫a,b,c

<script setup>
  let list = reactive(['a','b','c'])
  function test() {
    list.splice(1,0,'x');
  }
<script>
<ul>
  <li v-for="item in list">
    {{item}}
  </li>
</ul>
<button @click="test">test</button>

假如我们不写key,则三者以index标识,即0,1,2。
现在我们要往这个列表里面加一个元素,假设在ab之间加个x
数据变成['a','x','b','c']
可以发现之前存储为全局变量的b现在变成了那个x。
而如果设立了独特的key,则b还是b,只不过是下移了一些。(具体代码不写了,可以自己试试)

结语

  原本逻辑很清晰,要说出来还是有些混乱。核心就是: 相同key值的元素如果内容不发生改变,则对应的dom元素不进行更新,从而提高了性能。
  所以从原理上来说,如果不对list进行修改,那么不写key其实也没有关系,或者说,只要页面中的list不需要更新(打开这个页面后),有没有这个key应该都是无所谓的。但是如果list需要修改,那还是需要给每个item配置独一无二的key,以提高页面的性能。

标签:index,vue,渲染,元素,list,更新,item,key
From: https://www.cnblogs.com/oldsaltfish/p/18149306

相关文章

  • vue v-model 双向绑定
    回顾从vue2到vue3v-model双向绑定的写法变化场景v-model双向绑定,用于处理表单输入绑定,类似于react中的受控组件。//React受控组件functionApp(){const[text,setText]=useState("");return(<><h3>{text}</h3><inputvalue=......
  • 前端【TS】02-typescript【基础】【搭建Vite+Vue3+TS项目】【为ref标注类型】
    前置基于Vite创建Vue3+TS环境vite官方文档:https://cn.vitejs.dev/guide/vite除了支持基础阶段的纯TS环境之外,还支持Vue+TS开发环境的快速创建,命令如下:1npmcreatevite@latestvue-ts-project----templatevue-ts23//说明:41.npmcreatevite@lates......
  • 基于SpringBoot+Vue毕业生信息招聘平台系统
    需求分析3.1技术可行性:技术背景毕业生信息招聘平台是在Windows操作系统中进行开发运用的,而且目前PC机的各项性能已经可以胜任普通网站的web服务器。系统开发所使用的技术也都是自身所具有的,也是当下广泛应用的技术之一。系统的开发环境和配置都是可以自行安装的,系统使用Java开......
  • vue中ts引入组件,无法找到模块xxx的声明文件。xxx隐式拥有 "any" 类型。
    原因说明简单来说就是ts不认识.vue这个类型,需要定义声明。我刚学ts不是很懂为什么vite官方内写了那么多类型声明就是不写.vue。解决方法在项目根目录下找到env.d.ts文件,这个文件定义类型声明,简单地说就是让ts认识各种类型,尤其是文件。那么解决方法显而易见,我们自定义vue的......
  • Java面试题:为什么HashMap不建议使用对象作为Key?
    HashMap是一种基于哈希表的动态数据结构,它允许使用任意不可变对象作为键(key)来存储和检索数据。然而,在某些情况下,使用对象作为HashMap的键可能会遇到一些问题。 首先,我们需要明确对象作为HashMap的键需要满足一些条件:不可变性:对象的属性不能被修改,因为如果属性被修改,那......
  • vue3 优化ai生成的手写签名
    下面是baiduai生成的代码:在Vue3中实现手写签名功能,可以使用canvas元素来创建一个绘图区域,并监听鼠标事件来实现签名的记录。以下是一个简单的例子:vue<template><div><canvasref="signatureCanvas"@mousedown="startSigning"@mousemove="updat......
  • typescript安装问题=> for (let i = startIndex ?? 0; i < array.length; i++) {
    for(leti=startIndex??0;i<array.length;i++){^SyntaxError:Unexpectedtoken?atObject.exports.runInThisContext(vm.js:76:16)atModule._compile(module.js:542:28)atObject.Module._extensions..js(mo......
  • vuex结合websocket使用
    1、创建一个store文件夹,并在其中创建store.js文件,结合vuex:importVuefrom'vue'importVuexfrom'vuex'importcommonfrom"../common/common.js";Vue.use(Vuex)conststore=newVuex.Store({state:{/***是否需要强制登录*/......
  • Vue前端开发常用第三方资源库
    Vue前端第三方库集合......
  • 基于Springboot+vue的图书管理系统
    ​ 介绍基于Springboot+vue的图书管理系统系统主要分为管理员角色和用户角色,具体的功能设计包括注册登录管理、个人中心管理、用户信息管理、图书信息管理、借阅信息管理,论坛信息管理等模块。软件架构开发系统:Windows10/11架构模式:MVCJDK版本:JavaJDK1.8开发工具:ID......