VUE中Key的原理

192 阅读1分钟

VUE中Key的原理

一、问题

<div id="root">
  <h2>人员列表(遍历数组)</h2>
  <button @click.once="addPerson">添加一个老刘</button>
  <ul>
    <li v-for="(p, index) of persons" :key="index">
      {{p.name}}-{{p.age}}
      <input type="text">
    </li>
  </ul>
</div>

<script>
  const vm = new Vue({
    el: '#root',
    data: {
      persons: [
        { id: '001', name: '张三', age: 18 },
        { id: '002', name: '李四', age: 19 },
        { id: '003', name: '王五', age: 20 }
      ]
    },
    methods: {
      addPerson() {
        const p = {
          id: '004',
          name: '老刘',
          age: 21
        };

        this.persons.unshift(p);
      }
    }
  })
</script>

屏幕快照 2022-02-08 上午12.19.54.png

当点击按钮时,输入框数据发生了错位:

屏幕快照 2022-02-08 上午12.20.48.png

二、原理

屏幕快照 2022-02-08 上午12.34.17.png

通过虚拟DOM的比较(Diff算法),如果key值相同并且虚拟DOM相同(input),则会复用,所以会产生错位

注意:使用index作为key并不总是出现问题,只有当数据发生顺序性破坏的时候,才会出现,比如将老刘插入数组的第一位,如果放在尾部则不会出现问题

如果使用ID作为key值则不会发生错乱,并且效率更高(因为复用了DOM)

屏幕快照 2022-02-08 上午12.39.20.png

如果v-for不写key,则使用index作为key。

三、总结

屏幕快照 2022-02-08 上午12.43.56.png