我们知道Vue是采用的虚拟dom的方式进行更新节点,这样可以节省浏览器开销。那么Vue内部是如何通过diff算法来对新旧节点做比较从而更新dom呢?本文将从源码角度来剖析Vue内部的diff算法机制。 首先,我们进入到diff算法是核心函数 patch的定义之处,在core/vdom/patch.js里,
这里有个sameVnode方法,用于判断新旧节点是否相同。若一样,进入红框里的patchVnode方法,这是diff算法的核心。
当新节点不是一个纯文本节点时,如果新旧节点的子节点均存在,需要走updateChildren方法;否则,若新子节点存在,将新子节点添加进虚拟dom树,若旧子节点存在,从dom树上移除旧子节点;若旧子节点是文本,将其置空。
下面我们看下updateChildren方法,此方法用于比较两组子节点
这个方法首先设置首尾4个游标以及相对应的节点,然后定义后面进行查找时所需的变量。接着进入循环,若新开始节点与旧开始节点相同,执行patchVnode方法,游标向后移动;若两组结束节点相同,执行patchVnode方法,游标向前移动;若旧开始节点与新结束节点相同,将新节点插入到旧节点之前;若旧结束点点与新开始节点相同,将新节点插入到老节点之后。若两组及节点的首尾节点均没有相同的,将新开始节点在老节点组中找,若找不到,新建一个节点插入到虚拟dom树中,若找到了,进行更新。
以上就是Vue中虚拟dom树的diff算法的原理了。