189 8069 5689

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

本篇内容介绍了“vue中v-for指令的key值可以是index吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站制作、网站建设、玉屏网络推广、微信小程序开发、玉屏网络营销、玉屏企业策划、玉屏品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供玉屏建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com

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

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

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

父组件代码


list: [
    {
      count: 1,
      name: '第1个元素'
    },
    {
      count: 2,
      name: '第2个元素'
    },
    {
      count: 3,
      name: '第3个元素'
    }
  ]
  
handleDelete(index) {
  this.list.splice(index, 1)
},

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

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

子组件
  {{ name }}   count值为:{{ innerCount }}   -
props: {   count: {     type: Number,     default: 0   },   name: {     type: String,     default: ''   } }, data() {   return {     innerCount: this.count   }  }

感觉也没什么不对的啊。

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

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

正常了。

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

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

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

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

不依赖子组件状态

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

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

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

临时 DOM 状态


  
  删除

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

“vue中v-for指令的key值可以是index吗”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


分享标题:vue中v-for指令的key值可以是index吗
当前网址:http://jkwzsj.com/article/pecgod.html

其他资讯