key到底在v-for中有什么作用?

191 阅读1分钟

学习记录:v-for中为什么要使用key?

生成虚拟DOM时会使用diff算法,其过程就是调用名为patch的函数判断节点,源码中判断相同节点函数:

 function sameVnode(a, b) {
     return (
        a.key === b.key &&
        ((a.tag === b.tag &&
          a.isComment === b.isComment &&
          isDef(a.data) === isDef(b.data) &&
          sameInputType(a, b)) ||
          (isTrue(a.isAsyncPlaceholder) &&
            a.asyncFactory === b.asyncFactory &&
            isUndef(b.asyncFactory.error)))
      );
},

就地复用原则:直接用新的vnode

可看出若key不相同则直接判断为不同节点。

所以当我们给元素一个唯一的key值时,在dom发生变化时判断是否是相同节点。

举例说明:

存在A,B,C,D,E点,现在我们要在A,B点后面插入F点:

1.若不带key渲染,就地复用原则, A,B节点会直接复用之前不会重新渲染,而后面C,D,E无法使用就地复用原则,就会重新渲染。

2.若带key,通过key值ABCDE都可找到相同点,不需渲染,F点直接重新插入。

为什么不建议使用index作为key值:整体效果相当于不加key

1.若在直接在数组后面追加一条数据:

此时前几条数据页面不会重新渲染,直接复用之前的,只会新渲染最后一条数据,此时用index作为key,没有任何问题。

2.若在数组中插一条数据:

页面在去渲染数据的时候,通过index定义的key的比较,会有:

除了前几条可以就地复用外,后面的数据都要重新渲染

ps:个人学习记录,文中如有错误,欢迎指正