《Vuejs设计与实现》9.3 找到需要移动的元素

148 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第34天,点击查看活动详情

这一篇应该是我8月写的最后一篇了,最近太忙太累了,文章质量有所下降,敬请海涵。

再上一节中,我们已经想到了通过给vnode新增一个key属性来实现vnode的复用,并且我们可以实现在vnode的子元素只是位置变化的时候,我们可以去移动DOM而,从而减少DOM操作次数,提高性能,那么我们就需要解决第一个问题:怎么样找到需要移动的元素?

首先要明确的是,我们把vnode.children设计为数组很明智的,数组天然就有顺序,也就是下标,那么我们需要做的就是对比新旧vnode.children的下标。

image.png

我们看一下,vue中如何对比这两个vnode.children

  • 遍历newNode,下标为0,找到p-3.然后在oldNode中去找p-3,发现下标为2
  • 遍历newNode,下标为1,找到p-1.然后在oldNode中去找p-1,发现下标为0
  • 遍历newNode,下标为2,找到p-2.然后在oldNode中去找p-2,发现下标为1

这时候明显可以发现,在oldNode中查询返回的下标没有规律了,不再是递增的,因此我们需要移动对应的真实DOM.

因此我们判断元素是否需要移动的方法就是:在旧的vnode.children中,寻找具有相同key的过程中发现索引值不同,那么这个元素就需要移动

我们可以保存新节点或者旧节点的下标lastIndex,每次比较lastIndex是否与当前找到的相符。

这一节,我们已经知道了如何找到需要移动的元素,下一节,我们将试着去移动真实元素,从而完成节点顺序的更新.