Skip to content

Commit ae37c7c

Browse files
author
Brian Vaughn
committed
Split flushPassiveUnmountEffects() into two functions
One is used for mounted fibers, and one for unmounted subtrees.
1 parent c1a1be5 commit ae37c7c

File tree

1 file changed

+34
-4
lines changed

1 file changed

+34
-4
lines changed

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

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2783,15 +2783,12 @@ function flushPassiveUnmountEffects(firstChild: Fiber): void {
27832783
primarySubtreeTag !== NoSubtreeTag ||
27842784
primaryEffectTag !== NoEffect
27852785
) {
2786-
flushPassiveUnmountEffects(fiberToDelete);
2786+
flushPassiveUnmountEffectsInsideOfDeletedTree(fiberToDelete);
27872787
}
27882788

27892789
// Now that passive effects have been processed, it's safe to detach lingering pointers.
27902790
detachFiberAfterEffects(fiberToDelete);
27912791
}
2792-
2793-
// Clear deletions now that passive effects have been procssed.
2794-
fiber.deletions = null;
27952792
}
27962793

27972794
const child = fiber.child;
@@ -2822,6 +2819,39 @@ function flushPassiveUnmountEffects(firstChild: Fiber): void {
28222819
}
28232820
}
28242821

2822+
function flushPassiveUnmountEffectsInsideOfDeletedTree(
2823+
firstChild: Fiber,
2824+
): void {
2825+
let fiber = firstChild;
2826+
while (fiber !== null) {
2827+
const child = fiber.child;
2828+
if (child !== null) {
2829+
// If any children have passive effects then traverse the subtree.
2830+
// Note that this requires checking subtreeTag of the current Fiber,
2831+
// rather than the subtreeTag/effectsTag of the first child,
2832+
// since that would not cover passive effects in siblings.
2833+
const primarySubtreeTag = fiber.subtreeTag & PassiveSubtreeTag;
2834+
if (primarySubtreeTag !== NoSubtreeTag) {
2835+
flushPassiveUnmountEffectsInsideOfDeletedTree(child);
2836+
}
2837+
}
2838+
2839+
switch (fiber.tag) {
2840+
case FunctionComponent:
2841+
case ForwardRef:
2842+
case SimpleMemoComponent:
2843+
case Block: {
2844+
const primaryEffectTag = fiber.effectTag & Passive;
2845+
if (primaryEffectTag !== NoEffect) {
2846+
flushPassiveUnmountEffectsImpl(fiber);
2847+
}
2848+
}
2849+
}
2850+
2851+
fiber = fiber.sibling;
2852+
}
2853+
}
2854+
28252855
function flushPassiveUnmountEffectsImpl(fiber: Fiber): void {
28262856
const updateQueue: FunctionComponentUpdateQueue | null = (fiber.updateQueue: any);
28272857
const lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;

0 commit comments

Comments
 (0)