v-for为什么要加key

简介: v-for为什么要加key
本节内容:在日常开发中,经常会使用 v-for进行遍历,但是每次使用其时,都要被强制的加上 key,那么key究竟起着什么样的作用?话不多说,我们先看一个案例

一、案例

源码:

<div>
  <input type="text" v-model='name'>
  <button @click='add'>添加</button>
</div>
<ul>
  <li v-for='(item, i) in nameList' :key='item.id'>
    <input type="checkbox"> {{item.name}}
  </li>
</ul>
</div>
<script>
const HelloVueApp = {
  components: {
    getTitleComponent,
    toDoList
  },
  data() {
    return {
      bookTitle: '',
      selectVal: '',

      nameList: [
        { id: 1, name: '张三' },
        { id: 2, name: '李四' },
        { id: 3, name: '王五' }
      ],
      name: '',
      newId: 3
    }
  },
  methods: {
    add () {
        // 注意是 unshift 添加,将在头部添加元素
      this.nameList.unshift({id: ++this.newId, name: this.name})
      this.name = ''
    }
  }
}

Vue.createApp(HelloVueApp).mount('#app')
</script>

1、不加key值时

在这里插入图片描述

2、加key值时

在这里插入图片描述

  • 通过以上两个结果我们可以看出,当我们没加key值时,没有 key 属性,状态默认绑定的是位置;加上key值有 key 时,状态根据key的值绑定到了相应的数组元素上
  • vue组件高度复用增加Key可以标识组件的唯一性,为了更好地区别各个组件 ,key的作用主要是为了高效的更新虚拟DOM。
  • 由于key的唯一性,尽量把id作为key值。index索引的话因为并不具有唯一性,不能作为key值

Vue中这样说道:维护状态,当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。
在Key的语法当中我们得知:特殊 attribute 主要用做 Vue 的虚拟 DOM 算法的提示,以在比对新旧节点组时辨识 VNodes。如果不使用 key,Vue 会使用一种算法来最小化元素的移动并且尽可能尝试就地修改/复用相同类型元素。而使用 key 时,它会基于 key 的顺序变化重新排列元素,并且那些使用了已经不存在的 key 的元素将会被移除/销毁。

  • 一张图带你更深入的理解,如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算法。而使用 key 时,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。

在这里插入图片描述

相关文章
|
7月前
|
小程序
小程序for循环中key值的作用?
小程序for循环中key值的作用?
|
6月前
|
存储 NoSQL Redis
Redis第七弹-Set与ZSET基本操作,Set(集合特点)SADD key member(注意这个key,必须是你自定义名字,不能用key)​编辑SMEMBERS key-查询所有的key
Redis第七弹-Set与ZSET基本操作,Set(集合特点)SADD key member(注意这个key,必须是你自定义名字,不能用key)​编辑SMEMBERS key-查询所有的key
|
7月前
|
JavaScript 算法 索引
v-for为什么要加key
v-for为什么要加key
|
JavaScript 算法 索引
v-for中key值的作用
v-for中key值的作用
|
小程序 JavaScript 索引
小程序v-for与key值使用
小程序v-for与key值使用
182 0
|
JavaScript 索引
v-for循环为什么要绑定key值
v-for循环为什么要绑定key值
109 0
lodash检查字符串string是否以给定的字符串结尾
lodash检查字符串string是否以给定的字符串结尾
184 0
|
存储 Java
从数组当做map的key引发的思考
从数组当做map的key引发的思考
154 0