@@ -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.
158158let offscreenSubtreeIsHidden : boolean = false ;
159- const offscreenSubtreeIsHiddenStack : Array < boolean > = [];
160159let offscreenSubtreeWasHidden : boolean = false ;
161- const offscreenSubtreeWasHiddenStack: Array< boolean > = [];
162160
163161const PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set ;
164162
@@ -2305,11 +2303,35 @@ function commitLayoutEffects_begin(
23052303 const wasHidden = current !== null && current . memoizedState !== null ;
23062304 const isHidden = fiber . memoizedState !== null ;
23072305
2308- offscreenSubtreeWasHidden = wasHidden || offscreenSubtreeWasHidden ;
2309- offscreenSubtreeIsHidden = isHidden || offscreenSubtreeIsHidden ;
2306+ const newOffscreenSubtreeIsHidden =
2307+ isHidden || offscreenSubtreeIsHidden ;
2308+ const newOffscreenSubtreeWasHidden =
2309+ wasHidden || offscreenSubtreeWasHidden ;
23102310
2311- offscreenSubtreeWasHiddenStack . push ( wasHidden ) ;
2312- offscreenSubtreeIsHiddenStack . push ( isHidden ) ;
2311+ if (
2312+ newOffscreenSubtreeIsHidden !== offscreenSubtreeIsHidden ||
2313+ newOffscreenSubtreeWasHidden !== offscreenSubtreeWasHidden
2314+ ) {
2315+ const prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden ;
2316+ const prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden ;
2317+
2318+ // Traverse the Offscreen subtree with the current Offscreen as the root.
2319+ offscreenSubtreeIsHidden = newOffscreenSubtreeIsHidden ;
2320+ offscreenSubtreeWasHidden = newOffscreenSubtreeWasHidden ;
2321+ commitLayoutEffects_begin (
2322+ fiber , // New root; bubble back up to here and stop.
2323+ root ,
2324+ committedLanes ,
2325+ ) ;
2326+
2327+ // Restore Offscreen state and resume in our-progress traversal.
2328+ nextEffect = fiber ;
2329+ offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden ;
2330+ offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden ;
2331+ commitLayoutMountEffects_complete ( subtreeRoot , root , committedLanes ) ;
2332+
2333+ continue ;
2334+ }
23132335 }
23142336 }
23152337
@@ -2350,23 +2372,6 @@ function commitLayoutMountEffects_complete(
23502372 while ( nextEffect !== null ) {
23512373 const fiber = nextEffect ;
23522374
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-
23702375 if (
23712376 enableSuspenseLayoutEffectSemantics &&
23722377 isModernRoot &&
0 commit comments