Appearance
这里说的单一节点是指:更新后的 jsx 对象是 单一节点
更新流程
新节点 mount
新节点 mount 过程执行 左边路线,直接生成新 Fiber
js
function reconcileSingleElement(returnFiber, currentFirstFiber, element) {
// 1.父节点
// 2.当前Fiber节点(新节点为null)
// 3.节点更新的jsx 对象
// 根据 2 和 3 生成新节点
const key = element.key
let child = currentFirstFiber
// ...
const created = createFiberFromElement(element, returnFiber.mode, lanes);
created.ref = coerceRef(returnFiber, currentFirstChild, element);
created.return = returnFiber;
// 返回生成的新节点
return created;
}
节点update
js
function reconcileSingleElement(
returnFiber, currentFirstChild, element) {
const key = element.key
let child = currentFirstFiber
while(child !== null) {
if (child.key === key) {
// 更新前后 key 相同 而且 type 相同
switch (child.tag) {
//..
default: {
// 执行 可复用 DOM 逻辑(右边线路)
if (child.elementType === element.type) {
// 删除同级其他节点
deleteRemainingChildren(returnFiber, child.sibling);
// 复用当前child 的 Fiber 节点,克隆出一样的节点返回
const existing = useFiber(child, element.props);
existing.type = type;
existing.return = returnFiber;
return existing // 返回复用Fiber节点
}
break
}
}
// key 相同,但是 tag 不相同
// 标记 current 和 所有current.sibling 删除
deleteRemainingChildren(returnFiber, child);
break;
} else {
// key 不相同
// 标记 current 删除
deleteChild(returnFiber, child);
}
child = child.sibling;
}
// ...生成新节点返回
}