节点的patch(补丁)操作,是虚拟dom核心中的核心,就是对比出新旧节点中,变化了的那些部分。本质上来讲就三种情况:创建节点、删除节点和修改需要更新的节点

  1. 创建节点,两种情况。
  • 当oldVnode中不存在但是vnode中存在的某些节点时,需要创建新节点
  • 当新旧节点是完全不同的节点时,比如新节点时一个text,但是旧节点是一个div。此时需要删除旧的创建新的。
  1. 删除节点:上面提了不赘述

  2. 当两个节点是同一节点的时候,才需要进行更新节点的操作

  • 3.1 首先判断新旧节点是否为如下所示的静态节点:

    <p>asdasdasd</p>

    所谓的静态节点就是不存在状态的标签节点。
    此时,直接跳过,因为他不会变化。

  • 3.2 新节点是否为文本节点
    3.2.1 新节点是文本节点: 旧节点有children删children,有text覆盖更新
    3.2.2 新节点不是文本节点,是元素节点
    3.2.2.1 新节点有children
    3.2.2.1.1 旧节点无children:遍历新节点children挨个添加
    3.2.2.1.2 旧节点有children: Diff后论
    3.2.2.2 新节点无children:旧节点有text删text,有children删children

大致流程如上所述,下面稍微说一说更新子节点的diff算法。
毫无疑问我们需要遍历。遍历新节点的children,挨个去旧节点的children中去找,如果没找到,说明该节点是由于状态变化新增的节点,那就要创建。如果找到了那就更新。当然还有一个可能,就是找是找到了,但是位置变了,这时,就需要移动该节点的位置。

然后diff算法对比的具体过程遵循的几个原则:
新前旧前、新后旧后、新后旧前、新前旧后。这是人家的算法规则,至于为什么这么搞….人家愿意
暂且这样吧,有空再更…