Diff算法
- 过程:patch ---》patchVNode ---》更新子节点
- 描述:diff算法是用于vue中对DOM操作的性能优化,用Javascript的计算成本来换取DOM操作的成本
- 主要操作:创建节点,删除节点,更新节点,移动节点
可插入DOM中的节点类型
- 元素节点(存在tag属性)
- 文本节点
- 注释节点(存在isComment属性)
- 判断插入的类型的流程
Patch
Patch的过程就是去比对newVNode和oldVNode,先看oldVNode是否存在,否就使用newVNode创建节点并插入到视图中,当oldVNode和newVNode都存在,则比对它们是否是同一节点,如果不是同一节点,则根据newVNode创建真实节点,并插入到旧节点的旁边,然后删除视图中的旧节点,如果是同一节点,则进行patchVNode,进行更详细的比对。
PatchVNode
PatchVNode的过程
更新子节点
更新子节点的更新策略分为以下四个步骤:
- 创建子节点 通过对比oldChild和newChild,将需要创建的节点插入到真实DOM中,插入位置是所有未处理节点的前面。
- 更新子节点 通过比对同一子节点,当位置一致时,更新过程见PatchVNode,当位置不一致时,还需要进行一步移动子节点
- 移动子节点 通过对newVNode从左到右循环进行处理,到第一个未处理的节点时,去oldVNode中去寻找它的相同的节点,然后进行处理,再插入到所有未处理节点的前面。
- 删除子节点 由移动子节点可知,对于子节点的处理是从左到右循环进行处理的,当newVNode所有的节点处理完成之后,oldVNode中剩下的未处理的节点就是那些需要被删除的节点,将这些需要删除的节点删除后,真实DOM中的节点就喝newVNode中的节点相同了。