- 使用方法: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元素,不要混淆