snabbdom中patchVnode里updateChildren思路分析

91 阅读1分钟
  • 使用方法:updateChildren(parentElm,oldCh,newCh,insertedVnodeQueue)
  • 作用:对比所有子节点的差异,并更新真实DOM
  • Diff算法: DOM操作会引起页面的重排重绘

对比过程

1、开始节点
    如果新旧开始节点是sameVnode(key和sel相同)
    调用patchVnode()对比和更新节点
    把旧开始和新开始索引往后移动,oldStartIdx++/newStartIdx++
2、结束节点
    如果新旧结束节点是sameVnode(key和sel相同)
    调用patchVnode()对比和更新节点
    把旧结束和新结束索引往前移动,oldEndIdx--/newEndIdx--
3、旧开始节点/新结束节点
    调用patchVnode()对比和更新节点
    把oldStartVnode对应的DOM元素,移动到右边,更新索引
4、旧结束节点/新开始节点
    调用patchVnode()对比和更新节点
    把oldEndVnode对应的DOM元素,移动到左边,更新索引
5、将没有对比的新节点在老节点中进行遍历查找相同节点
    将没有遍历到的旧节点放到一个map中,如果在旧节点中找不到,就创建新节点,如果找到就对比更新,之后都要newStartIdx++
6、循环结束
    6.1 当老节点的所有子节点先遍历完成(oldStartIdx>oldEndIdx),循环结束
        说要新节点有剩余,把剩余节点批量插入到右边
    6.2 当新节点的所有子节点先遍历完成(newStartIdx>newEndIdx),循环结束
        说明老节点有剩余,把剩余节点批量删除
  • 对比分析的时候,要注意区分,对比的是新旧子节点数组,移动的是真实DOM元素,不要混淆