v-for为什么要加key

首先不加key更快,更快,更快。重要的事情说三遍。
如果循环的列表,就是静态展示,没有添加,插入,删除,修改状态等操作,就不用加key。
什么,开发工具报错?不用管它就对了。

说到这个问题想必要举个例子了

image

没有key

<script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script>
 <div id="app">
    <div>
      <input type="text" v-model="name">
      <button @click="add">添加</button>
    </div>
    <ul>
      <li v-for="(item, i) in list">
        <input type="checkbox"> {{item.name}}
      </li>
    </ul>
<script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        name: '',
        newId: 3,
        list: [
          { id: 1, name: '李斯' },
          { id: 2, name: '吕不韦' },
          { id: 3, name: '嬴政' }
        ]
      },
      methods: {
        add() {
         //注意这里是unshift
          this.list.unshift({ id: ++this.newId, name: this.name })
          this.name = ''
        }
      }
    });
  </script>
  </div>

当选中吕不为时,添加楠楠后选中的确是李斯,并不是我们想要的结果,我们想要的是当添加楠楠后,一种选中的是吕不为

image
image

有key

  <div id="app">
    <div>
      <input type="text" v-model="name">
      <button @click="add">添加</button>
    </div>
    <ul>
      <li v-for="(item, i) in list" :key="item.id">
        <input type="checkbox"> {{item.name}}
      </li>
    </ul>
<script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        name: '',
        newId: 3,
        list: [
          { id: 1, name: '李斯' },
          { id: 2, name: '吕不韦' },
          { id: 3, name: '嬴政' }
        ]
      },
      methods: {
        add() {
         //注意这里是unshift
          this.list.unshift({ id: ++this.newId, name: this.name })
          this.name = ''
        }
      }
    });
  </script>
  </div>

同样当选中吕不为时,添加楠楠后依旧选中的是吕不为。

image
image

可以简单的这样理解:加了key(一定要具有唯一性) id的checkbox跟内容进行了一个关联。是我们想达到的效果
如果key没有唯一性,比如key为item.name,那么出现同名的name,就会出上面的问题。

查过相关文档,图例说明很清晰。

vue和react的虚拟DOM的Diff算法大致相同,其核心是基于两个简单的假设
首先讲一下diff算法的处理方法,对操作前后的dom树同一层的节点进行对比,一层一层对比,如下图:

image

当某一层有很多相同的节点时,也就是列表节点时,Diff算法的更新过程默认情况下也是遵循以上原则。
比如一下这个情况:

image

我们希望可以在B和C之间加一个F,Diff算法默认执行起来是这样的:

image

即把C更新成F,D更新成C,E更新成D,最后再插入E,是不是很没有效率?

所以我们需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。

image

vue中列表循环需加:key="唯一标识" 唯一标识可以是item里面id index等,因为vue组件高度复用增加Key可以标识组件的唯一性,为了更好地区别各个组件 key的作用主要是为了高效的更新虚拟DOM

作者:Nanshannan
链接:https://www.jianshu.com/p/4bd5e745ce95
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 说到这个问题想必要举个例子了 没有key 当选中吕不为时,添加楠楠后选中的确是李斯,并不是我们想要的结果,我们想要...
    world_7735阅读 6,380评论 5 31
  • 喜欢请关注 会不定时更新 *** 说到这个问题想必要举个例子了 当选中吕不为时,添加楠楠后选中的确是李斯,并不是我...
    Nanshannan阅读 245,495评论 31 119
  • 主要记录:一、 有key和没key的差异二、 key的作用三、 相关demo代码 一、有key和没key的差异 1...
    HYC_阅读 7,414评论 2 0
  • v-for中key的作用1.当数据发生变化时,vue是怎样更新节点的?渲染真实DOM的开销是很大的,比如有时我们修...
    AizawaSayo阅读 6,102评论 0 2
  • 之前项目有个功能,数据间有三层关系,通过3个v-for实现,渲染页面元素的时候,出现错乱的情况,有点抓瞎。感觉和虚...
    南山_shicl阅读 13,347评论 1 3

友情链接更多精彩内容