详解vue的diff算法原理(3)

oldS 和 E 匹配,就将原本的b节点移动到最后,因为 E 是最后一个节点,他们位置要一致,这就是上面说的: 当其中两个能匹配上那么真实dom中的相应节点会移到Vnode相应的位置 ,此时dom的位置为:a d b

第三步

oldS = d, oldE = d; S = c, E = d;

oldE 和 E 匹配,位置不变此时dom的位置为:a d b

第四步

oldS++; oldE--; oldS > oldE;

遍历结束,说明 oldCh 先遍历完。就将剩余的 vCh 节点根据自己的的index插入到真实dom中去,此时dom位置为:a c d b

一次模拟完成。

这个匹配过程的结束有两个条件:

oldS > oldE 表示 oldCh 先遍历完,那么就将多余的 vCh 根据index添加到dom中去(如上图) S > E 表示vCh先遍历完,那么就在真实dom中将区间为 [oldS, oldE] 的多余节点删掉

详解vue的diff算法原理

下面再举一个例子,可以像上面那样自己试着模拟一下

详解vue的diff算法原理

当这些节点 sameVnode 成功后就会紧接着执行 patchVnode 了,可以看一下上面的代码

if (sameVnode(oldStartVnode, newStartVnode)) { patchVnode(oldStartVnode, newStartVnode) }

就这样层层递归下去,直到将oldVnode和Vnode中的所有子节点比对完。也将dom的所有补丁都打好啦。那么现在再回过去看updateChildren的代码会不会容易很多呢?

总结

以上为diff算法的全部过程,放上一张文章开始就发过的总结图,可以试试看着这张图回忆一下diff的过程。

详解vue的diff算法原理

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/9ec84015a04faf5c275ddc4dac928bb0.html