Skip to content
On this page

这里说的单一节点是指:更新后的 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;
	}
	// ...生成新节点返回
}