vue中v-for指令的key值可以是index吗(key,v-for,vue,编程语言)

时间:2024-05-03 22:10:46 作者 : 石家庄SEO 分类 : 编程语言
  • TAG :

vue中v-for指令的key值可以是index吗

为什么 v-for 的 key 值不能是 index?

来看一下我的线上bug演示吧:

父组件代码<Childv-for="(item,index)inlist":key="index":count="item.count":name="item.name"@delete="handleDelete(index)"/>list:[{count:1,name:'第1个元素'},{count:2,name:'第2个元素'},{count:3,name:'第3个元素'}]handleDelete(index){this.list.splice(index,1)},

等一下,第三个元素的count值居然变成了2,wtf!!!

惊得我又去看了遍子组件的代码

子组件<div><span>{{name}}</span>count值为:{{innerCount}}<button@click="$emit('delete')">-</button></div>props:{count:{type:Number,default:0},name:{type:String,default:''}},data(){return{innerCount:this.count}}

感觉也没什么不对的啊。

不信邪,我又多创建了点元素来删除,还试了下排序:果然,不光删除元素有问题,排序也有问题。

把 key 值改成 item.name 再试一下。

<Childv-for="(item,index)inlist":key="item.name":count="item.count":name="item.name"@delete="handleDelete(index)"/>

正常了。

这样看来,在 v-for 里把 key 值写成 index,非常危险啊。

在查阅了 vue 官方文档之后,我终于明白了原因:

当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。

这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出

不依赖子组件状态

子组件里有一行很关键的代码

data(){return{innerCount:this.count}}

子组件内部定义了 innerCount,这样子组件就有了自己的状态,按照官方文档的说明,这种情况下不能把 index 作为 key 值。

临时 DOM 状态

<divv-for="(item,index)inlist1":key="index"><inputtype="text"/><button@click="delClick(index)">删除</button></div>

删除了第2项,但是第3项在表单中的3变成了2,跟上面依赖子组件状态的例子是一样的。

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:vue中v-for指令的key值可以是index吗的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Helm常用基本命令有哪些下一篇:

16 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18