Vue中Diff算法-节点更新过程

288 阅读2分钟

Diff算法

  • 过程:patch ---》patchVNode ---》更新子节点
  • 描述:diff算法是用于vue中对DOM操作的性能优化,用Javascript的计算成本来换取DOM操作的成本
  • 主要操作:创建节点,删除节点,更新节点,移动节点

可插入DOM中的节点类型

  • 元素节点(存在tag属性)
  • 文本节点
  • 注释节点(存在isComment属性)
  • 判断插入的类型的流程 节点类型判断

Patch

Patch的过程就是去比对newVNode和oldVNode,先看oldVNode是否存在,否就使用newVNode创建节点并插入到视图中,当oldVNode和newVNode都存在,则比对它们是否是同一节点,如果不是同一节点,则根据newVNode创建真实节点,并插入到旧节点的旁边,然后删除视图中的旧节点,如果是同一节点,则进行patchVNode,进行更详细的比对。

PatchVNode

PatchVNode的过程 PatchVNode过程

更新子节点

更新子节点的更新策略分为以下四个步骤:

  • 创建子节点 通过对比oldChild和newChild,将需要创建的节点插入到真实DOM中,插入位置是所有未处理节点的前面。
  • 更新子节点 通过比对同一子节点,当位置一致时,更新过程见PatchVNode,当位置不一致时,还需要进行一步移动子节点
  • 移动子节点 通过对newVNode从左到右循环进行处理,到第一个未处理的节点时,去oldVNode中去寻找它的相同的节点,然后进行处理,再插入到所有未处理节点的前面。
  • 删除子节点 由移动子节点可知,对于子节点的处理是从左到右循环进行处理的,当newVNode所有的节点处理完成之后,oldVNode中剩下的未处理的节点就是那些需要被删除的节点,将这些需要删除的节点删除后,真实DOM中的节点就喝newVNode中的节点相同了。