免费网站app软件,南京建设银行网站,做类似淘宝网站多少钱,博山区住房和城乡建设局网站假设我们有两个虚拟节点 oldVnode 和 newVnode#xff0c;它们分别对应的DOM结构为#xff1a;
我们需要将 oldVnode 更新为 newVnode#xff0c;这时就可以使用双端比较算法了。算法本质上是将新旧节点进行一次交叉比较#xff0c;尽可能地重复使用已有的节点来达到最小…假设我们有两个虚拟节点 oldVnode 和 newVnode它们分别对应的DOM结构为
我们需要将 oldVnode 更新为 newVnode这时就可以使用双端比较算法了。算法本质上是将新旧节点进行一次交叉比较尽可能地重复使用已有的节点来达到最小化DOM操作的目标。
首先我们定义四个指针
新节点的开始位置 newStartIdx新节点的结束位置 newEndIdx旧节点的开始位置 oldStartIdx旧节点的结束位置 oldEndIdx
初始时这些指针分别指向 oldVnode 和 newVnode 的第一个和最后一个节点。即
newStartIdx 0
newEndIdx newVnode.children.length - 1
oldStartIdx 0
oldEndIdx oldVnode.children.length - 1接下来我们需要在循环中移动这些指针比较新节点和旧节点的元素找到它们之间的差异。具体操作流程如下
比较新旧节点首尾元素
首先比较 oldVnode[oldStartIdx] 和 newVnode[newStartIdx]如果它们相等则表示该节点无需更新直接把指针向后移动即可。然后比较 oldVnode[oldEndIdx] 和 newVnode[newEndIdx]如果它们相等则同样把指针向前移动。
比较其他节点
如果首尾元素对比没有匹配则需要进行更详细的比较从而找出需要添加、删除和移动的节点。具体操作如下
首先在旧节点的范围内查找与 newVnode[newStartIdx] 相同的节点如果找到就说明该节点可以被复用把指针向后移动。如果在旧节点中未找到相同的节点则需要插入 newVnode[newStartIdx] 对应的节点到 oldVnode 中把指针向后移动。然后在新节点的范围内查找与 oldVnode[oldStartIdx] 相同的节点如果找到就说明该节点可以被复用把指针向后移动。如果在新节点中未找到相同的节点则说明旧节点中的该节点需要被删除把指针向后移动。然后在旧节点的范围内查找与 newVnode[newEndIdx] 相同的节点如果找到就说明该节点可以被复用把指针向前移动。如果在旧节点中未找到相同的节点则需要插入 newVnode[newEndIdx] 对应的节点到 oldVnode 中把指针向前移动。最后在新节点和旧节点的范围内查找剩余的节点进行比较确定需要插入、删除和移动的位置。
通过这样的方式我们就可以实现双端比较算法了。它可以最大限度地重用已有的节点避免不必要的DOM操作从而提高渲染性能。