学习记录: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:个人学习记录,文中如有错误,欢迎指正