React Fiber 隐藏上下文
一、作用
二、推送隐藏上下文
备注
push()由 ReactFiberStack#push 实现pop()由 ReactFiberStack#pop 实现getEntangledRenderLanes()由 ReactFiberWorkLoop 提供setEntangledRenderLanes()由 ReactFiberWorkLoop 提供mergeLanes()由 ReactFiberLane#mergeLanes 实现
export function pushHiddenContext(fiber: Fiber, context: HiddenContext): void {
const prevEntangledRenderLanes = getEntangledRenderLanes();
push(prevEntangledRenderLanesCursor, prevEntangledRenderLanes, fiber);
push(currentTreeHiddenStackCursor, context, fiber);
// When rendering a subtree that's currently hidden, we must include all
// lanes that would have rendered if the hidden subtree hadn't been deferred.
// That is, in order to reveal content from hidden -> visible, we must commit
// all the updates that we skipped when we originally hid the tree.
//
// 当渲染当前隐藏的子树时,我们必须包含所有本应渲染的任务队列,即使这些子树被延迟了。
// 也就是说,为了将内容从隐藏 -> 可见显示出来,我们必须提交最初隐藏树时跳过的所有更新。
setEntangledRenderLanes(
mergeLanes(prevEntangledRenderLanes, context.baseLanes),
);
}
三、在堆栈上重用隐藏上下文
备注
push()由 ReactFiberStack#push 实现getEntangledRenderLanes()由 ReactFiberWorkLoop 提供
export function reuseHiddenContextOnStack(fiber: Fiber): void {
// This subtree is not currently hidden, so we don't need to add any lanes
// to the render lanes. But we still need to push something to avoid a
// context mismatch. Reuse the existing context on the stack.
//
// 这个子树目前没有被隐藏,所以我们不需要向渲染通道添加任何内容
// 但我们仍然需要推送一些东西,以避免上下文不匹配。重用堆栈上现有的上下文。
push(prevEntangledRenderLanesCursor, getEntangledRenderLanes(), fiber);
push(
currentTreeHiddenStackCursor,
currentTreeHiddenStackCursor.current,
fiber,
);
}
四、弹出隐藏上下文
备注
pop()由 ReactFiberStack#pop 实现setEntangledRenderLanes()由 ReactFiberWorkLoop 提供
export function popHiddenContext(fiber: Fiber): void {
// Restore the previous render lanes from the stack
// 从堆栈恢复以前的渲染通道
setEntangledRenderLanes(prevEntangledRenderLanesCursor.current);
pop(currentTreeHiddenStackCursor, fiber);
pop(prevEntangledRenderLanesCursor, fiber);
}
五、当前树是否隐藏
export function isCurrentTreeHidden(): boolean {
return currentTreeHiddenStackCursor.current !== null;
}
六、常量
1. 当前树隐藏堆栈指针
备注
createCursor()由 ReactFiberStack#createCursor 实现
// TODO: This isn't being used yet, but it's intended to replace the
// InvisibleParentContext that is currently managed by SuspenseContext.
//
// 待办事项:此功能尚未使用,但其目的是取代当前由 SuspenseContext
// 管理的 InvisibleParentContext。
export const currentTreeHiddenStackCursor: StackCursor<HiddenContext | null> =
createCursor(null);
2. 上一个纠缠渲染 Lane 指针
备注
createCursor()由 ReactFiberStack#createCursor 实现
export const prevEntangledRenderLanesCursor: StackCursor<Lanes> =
createCursor(NoLanes);