reconcileChildrenArray
一句话结论:数组 Diff 先走线性快路径,遇到错位再用 Map 通过 key 查找复用;移动/插入会打 Placement,最终把没被复用的旧节点标记删除。
1. 两阶段策略(概念)
- 第一阶段:从头开始按索引对比,key/type 都匹配就复用并继续
- 第二阶段:一旦不匹配
- 把剩余旧节点放入 Map(key 或 index 作为索引)
- 遍历剩余新节点:用 key 查 Map 找可复用 Fiber
2. 如何判断“移动”
- 复用到的旧 Fiber 有一个旧索引
oldIndex - 若
oldIndex < lastPlacedIndex,说明它相对前面节点“往后挪了”,需要 Placement(移动) - 否则更新
lastPlacedIndex = oldIndex
3. 删除怎么处理
- Map 里最终剩下的旧 Fiber:表示新 children 中没有对应节点 → 标记删除