v-for为什么要加key(2019-12-19)

举个例子:

没有key

 <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>

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

3I0U9NL2I2LJVV}TOR20EYL.png

添加元素之后,本来选中的是吕不韦,结果变成了李斯

因为元素是先加载到虚拟DOM中,然后再渲染到DOM,这个渲染的过程中要用到Diff算法
,首先对比两者有什么不同,然后把不同的元素添加到DOM中,按正常思路如果插入了一个元素应该是直接在插入的位置新建一个元素,但是diff算法默认是把添加元素的位置之后的元素全部向下移一格,而不是直接插入,所以元素的对应关系就出现了问题。具体思路:https://www.bilibili.com/video/av59594689?p=37

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

推荐阅读更多精彩内容

友情链接更多精彩内容