首先说一下为什么要双端比较,这是由于之前的单端比较是有不必要的损耗的。
上图的单端比较重,我们会移动两次DOM节点,但是看了新老节点的示意图我们就一目了然的知道,最简单的办法是将p-3对应的元素移动到最后面即可,只需要一次操作。
双端Diff就能解决这个问题。
如上图,我们会有四个索引。分别指向新节点的开始节点,结束节点,以及旧节点的开始节点和结束节点。
每一轮Diff,我们都会重复下面四步比较:
newStartIdx
与oldStartIdx
索引,指向下一个新旧节点。开始下一轮循环oldEndIndex
指向的真实节点的后面)。并开始下一轮循环。以上四步,只要符合一步,则更新真实节点的内容,并且移动真实节点。移动后修改对应索引值,并再次重新开始对比。
还是一开始的例子,双端比较比单端比较在大部分情况下所做的操作更少。
只做一次DOM移动操作
上面的例子中,我们默认了只要比较了新旧列表的四个角即可命中一个,但是如果没有命中应该怎么操作呢?如下图所示的数据结构则无法命中。