@@ -123,7 +123,7 @@ import {
123
123
MutationMask ,
124
124
LayoutMask ,
125
125
PassiveMask ,
126
- PlacementDEV ,
126
+ NeedsDoubleInvokedEffectsDEV ,
127
127
Visibility ,
128
128
} from './ReactFiberFlags' ;
129
129
import {
@@ -3239,24 +3239,33 @@ function recursivelyTraverseAndDoubleInvokeEffectsInDEV(
3239
3239
parentFiber : Fiber ,
3240
3240
isInStrictMode : boolean ,
3241
3241
) {
3242
- if ( ( parentFiber . subtreeFlags & ( PlacementDEV | Visibility ) ) === NoFlags ) {
3242
+ if (
3243
+ ( parentFiber . subtreeFlags & ( NeedsDoubleInvokedEffectsDEV | Visibility ) ) ===
3244
+ NoFlags
3245
+ ) {
3243
3246
// Parent's descendants have already had effects double invoked.
3244
3247
// Early exit to avoid unnecessary tree traversal.
3245
3248
return ;
3246
3249
}
3250
+
3247
3251
let child = parentFiber . child ;
3248
3252
while ( child !== null ) {
3249
3253
doubleInvokeEffectsInDEVIfNecessary ( root , child , isInStrictMode ) ;
3250
3254
child = child . sibling ;
3251
3255
}
3252
3256
}
3253
3257
3254
- // Unconditionally disconnects and connects passive and layout effects.
3255
- function doubleInvokeEffectsOnFiber ( root : FiberRoot , fiber : Fiber ) {
3256
- disappearLayoutEffects ( fiber ) ;
3257
- disconnectPassiveEffect ( fiber ) ;
3258
- reappearLayoutEffects ( root , fiber . alternate , fiber , false ) ;
3259
- reconnectPassiveEffects ( root , fiber , NoLanes , null , false ) ;
3258
+ // NeedsDoubleInvokedEffectsDEV needs to be unset once effects are double invoked.
3259
+ // This is to keep track of fibers which need to have their effects double invoked.
3260
+ function recursivelyUnsetNeedsDoubleInvokedEffectsDEV ( parentFiber : Fiber ) {
3261
+ if ( parentFiber . subtreeFlags & NeedsDoubleInvokedEffectsDEV ) {
3262
+ parentFiber . flags &= ~ NeedsDoubleInvokedEffectsDEV ;
3263
+ let child = parentFiber . child ;
3264
+ while ( child !== null ) {
3265
+ recursivelyUnsetNeedsDoubleInvokedEffectsDEV ( child ) ;
3266
+ child = child . sibling ;
3267
+ }
3268
+ }
3260
3269
}
3261
3270
3262
3271
function doubleInvokeEffectsInDEVIfNecessary (
@@ -3270,10 +3279,14 @@ function doubleInvokeEffectsInDEVIfNecessary(
3270
3279
// First case: the fiber **is not** of type OffscreenComponent. No
3271
3280
// special rules apply to double invoking effects.
3272
3281
if ( fiber . tag !== OffscreenComponent ) {
3273
- if ( fiber . flags & PlacementDEV ) {
3282
+ if ( fiber . flags & NeedsDoubleInvokedEffectsDEV ) {
3274
3283
setCurrentDebugFiberInDEV ( fiber ) ;
3275
3284
if ( isInStrictMode ) {
3276
- doubleInvokeEffectsOnFiber ( root , fiber ) ;
3285
+ disappearLayoutEffects ( fiber ) ;
3286
+ disconnectPassiveEffect ( fiber ) ;
3287
+ reappearLayoutEffects ( root , fiber . alternate , fiber , false ) ;
3288
+ reconnectPassiveEffects ( root , fiber , NoLanes , null , false ) ;
3289
+ recursivelyUnsetNeedsDoubleInvokedEffectsDEV ( fiber ) ;
3277
3290
}
3278
3291
resetCurrentDebugFiberInDEV ( ) ;
3279
3292
} else {
@@ -3287,25 +3300,10 @@ function doubleInvokeEffectsInDEVIfNecessary(
3287
3300
}
3288
3301
3289
3302
// Second case: the fiber **is** of type OffscreenComponent.
3290
- // This branch contains cases specific to Offscreen.
3291
3303
if ( fiber . memoizedState === null ) {
3292
- // Only consider Offscreen that is visible.
3304
+ // Only continue traversal if Offscreen is visible.
3293
3305
// TODO (Offscreen) Handle manual mode.
3294
- setCurrentDebugFiberInDEV ( fiber ) ;
3295
- if ( isInStrictMode && fiber . flags & Visibility ) {
3296
- // Double invoke effects on Offscreen's subtree only
3297
- // if it is visible and its visibility has changed.
3298
- doubleInvokeEffectsOnFiber ( root , fiber ) ;
3299
- } else if ( fiber . subtreeFlags & PlacementDEV ) {
3300
- // Something in the subtree could have been suspended.
3301
- // We need to continue traversal and find newly inserted fibers.
3302
- recursivelyTraverseAndDoubleInvokeEffectsInDEV (
3303
- root ,
3304
- fiber ,
3305
- isInStrictMode ,
3306
- ) ;
3307
- }
3308
- resetCurrentDebugFiberInDEV ( ) ;
3306
+ recursivelyTraverseAndDoubleInvokeEffectsInDEV ( root , fiber , isInStrictMode ) ;
3309
3307
}
3310
3308
}
3311
3309
0 commit comments