Skip to content

Commit ecf6c46

Browse files
author
Brian Vaughn
committed
Offscreen: Use JS stack to track hidden/unhidden subtree state
1 parent ee6a05c commit ecf6c46

File tree

2 files changed

+58
-46
lines changed

2 files changed

+58
-46
lines changed

packages/react-reconciler/src/ReactFiberCommitWork.new.js

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,7 @@ if (__DEV__) {
156156
// Allows us to avoid traversing the return path to find the nearest Offscreen ancestor.
157157
// Only used when enableSuspenseLayoutEffectSemantics is enabled.
158158
let offscreenSubtreeIsHidden: boolean = false;
159-
const offscreenSubtreeIsHiddenStack: Array<boolean> = [];
160159
let offscreenSubtreeWasHidden: boolean = false;
161-
const offscreenSubtreeWasHiddenStack: Array<boolean> = [];
162160

163161
const PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;
164162

@@ -2283,6 +2281,7 @@ export function commitLayoutEffects(
22832281
committedLanes: Lanes,
22842282
): void {
22852283
nextEffect = finishedWork;
2284+
22862285
commitLayoutEffects_begin(finishedWork, root, committedLanes);
22872286
}
22882287

@@ -2305,11 +2304,35 @@ function commitLayoutEffects_begin(
23052304
const wasHidden = current !== null && current.memoizedState !== null;
23062305
const isHidden = fiber.memoizedState !== null;
23072306

2308-
offscreenSubtreeWasHidden = wasHidden || offscreenSubtreeWasHidden;
2309-
offscreenSubtreeIsHidden = isHidden || offscreenSubtreeIsHidden;
2307+
const newOffscreenSubtreeIsHidden =
2308+
isHidden || offscreenSubtreeIsHidden;
2309+
const newOffscreenSubtreeWasHidden =
2310+
wasHidden || offscreenSubtreeWasHidden;
2311+
2312+
if (
2313+
newOffscreenSubtreeIsHidden !== offscreenSubtreeIsHidden ||
2314+
newOffscreenSubtreeWasHidden !== offscreenSubtreeWasHidden
2315+
) {
2316+
const prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden;
2317+
const prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;
2318+
2319+
nextEffect = fiber;
2320+
offscreenSubtreeIsHidden = newOffscreenSubtreeIsHidden;
2321+
offscreenSubtreeWasHidden = newOffscreenSubtreeWasHidden;
2322+
2323+
// Traverse the Offscreen subtree with the current Offscreen as the root.
2324+
commitLayoutEffects_begin(
2325+
fiber, // New root; bubble back up to here and stop.
2326+
root,
2327+
committedLanes,
2328+
);
2329+
2330+
nextEffect = fiber.sibling;
2331+
offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden;
2332+
offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
23102333

2311-
offscreenSubtreeWasHiddenStack.push(wasHidden);
2312-
offscreenSubtreeIsHiddenStack.push(isHidden);
2334+
continue;
2335+
}
23132336
}
23142337
}
23152338

@@ -2350,23 +2373,6 @@ function commitLayoutMountEffects_complete(
23502373
while (nextEffect !== null) {
23512374
const fiber = nextEffect;
23522375

2353-
if (enableSuspenseLayoutEffectSemantics && isModernRoot) {
2354-
if (fiber.tag === OffscreenComponent) {
2355-
offscreenSubtreeWasHiddenStack.pop();
2356-
offscreenSubtreeIsHiddenStack.pop();
2357-
offscreenSubtreeWasHidden =
2358-
offscreenSubtreeWasHiddenStack.length > 0 &&
2359-
offscreenSubtreeWasHiddenStack[
2360-
offscreenSubtreeWasHiddenStack.length - 1
2361-
];
2362-
offscreenSubtreeIsHidden =
2363-
offscreenSubtreeIsHiddenStack.length > 0 &&
2364-
offscreenSubtreeIsHiddenStack[
2365-
offscreenSubtreeIsHiddenStack.length - 1
2366-
];
2367-
}
2368-
}
2369-
23702376
if (
23712377
enableSuspenseLayoutEffectSemantics &&
23722378
isModernRoot &&

packages/react-reconciler/src/ReactFiberCommitWork.old.js

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,7 @@ if (__DEV__) {
156156
// Allows us to avoid traversing the return path to find the nearest Offscreen ancestor.
157157
// Only used when enableSuspenseLayoutEffectSemantics is enabled.
158158
let offscreenSubtreeIsHidden: boolean = false;
159-
const offscreenSubtreeIsHiddenStack: Array<boolean> = [];
160159
let offscreenSubtreeWasHidden: boolean = false;
161-
const offscreenSubtreeWasHiddenStack: Array<boolean> = [];
162160

163161
const PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;
164162

@@ -2283,6 +2281,7 @@ export function commitLayoutEffects(
22832281
committedLanes: Lanes,
22842282
): void {
22852283
nextEffect = finishedWork;
2284+
22862285
commitLayoutEffects_begin(finishedWork, root, committedLanes);
22872286
}
22882287

@@ -2305,11 +2304,35 @@ function commitLayoutEffects_begin(
23052304
const wasHidden = current !== null && current.memoizedState !== null;
23062305
const isHidden = fiber.memoizedState !== null;
23072306

2308-
offscreenSubtreeWasHidden = wasHidden || offscreenSubtreeWasHidden;
2309-
offscreenSubtreeIsHidden = isHidden || offscreenSubtreeIsHidden;
2307+
const newOffscreenSubtreeIsHidden =
2308+
isHidden || offscreenSubtreeIsHidden;
2309+
const newOffscreenSubtreeWasHidden =
2310+
wasHidden || offscreenSubtreeWasHidden;
2311+
2312+
if (
2313+
newOffscreenSubtreeIsHidden !== offscreenSubtreeIsHidden ||
2314+
newOffscreenSubtreeWasHidden !== offscreenSubtreeWasHidden
2315+
) {
2316+
const prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden;
2317+
const prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;
2318+
2319+
nextEffect = fiber;
2320+
offscreenSubtreeIsHidden = newOffscreenSubtreeIsHidden;
2321+
offscreenSubtreeWasHidden = newOffscreenSubtreeWasHidden;
2322+
2323+
// Traverse the Offscreen subtree with the current Offscreen as the root.
2324+
commitLayoutEffects_begin(
2325+
fiber, // New root; bubble back up to here and stop.
2326+
root,
2327+
committedLanes,
2328+
);
2329+
2330+
nextEffect = fiber.sibling;
2331+
offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden;
2332+
offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
23102333

2311-
offscreenSubtreeWasHiddenStack.push(wasHidden);
2312-
offscreenSubtreeIsHiddenStack.push(isHidden);
2334+
continue;
2335+
}
23132336
}
23142337
}
23152338

@@ -2350,23 +2373,6 @@ function commitLayoutMountEffects_complete(
23502373
while (nextEffect !== null) {
23512374
const fiber = nextEffect;
23522375

2353-
if (enableSuspenseLayoutEffectSemantics && isModernRoot) {
2354-
if (fiber.tag === OffscreenComponent) {
2355-
offscreenSubtreeWasHiddenStack.pop();
2356-
offscreenSubtreeIsHiddenStack.pop();
2357-
offscreenSubtreeWasHidden =
2358-
offscreenSubtreeWasHiddenStack.length > 0 &&
2359-
offscreenSubtreeWasHiddenStack[
2360-
offscreenSubtreeWasHiddenStack.length - 1
2361-
];
2362-
offscreenSubtreeIsHidden =
2363-
offscreenSubtreeIsHiddenStack.length > 0 &&
2364-
offscreenSubtreeIsHiddenStack[
2365-
offscreenSubtreeIsHiddenStack.length - 1
2366-
];
2367-
}
2368-
}
2369-
23702376
if (
23712377
enableSuspenseLayoutEffectSemantics &&
23722378
isModernRoot &&

0 commit comments

Comments
 (0)