From 6ef997b534bfbf10071401ea15b39a678d557135 Mon Sep 17 00:00:00 2001 From: Andrew Clark Date: Thu, 30 Jul 2020 08:17:22 -0500 Subject: [PATCH] Check for passive effects on the root fiber (#19488) The root fiber doesn't have a parent from which we can read the `subtreeTag`, so we need to check its `effectTag` directly. The root fiber previously did not have any pending passive effects, but it does now that deleted fibers are cleaned up in the passive phase. This allows us to remove a `schedulePassiveEffectCallback` call from the synchronous unmount path. Co-authored-by: Brian Vaughn --- packages/react-reconciler/src/ReactFiberCommitWork.new.js | 2 -- packages/react-reconciler/src/ReactFiberWorkLoop.new.js | 5 ++++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberCommitWork.new.js b/packages/react-reconciler/src/ReactFiberCommitWork.new.js index 3c7a8bbd19..3732c81ce6 100644 --- a/packages/react-reconciler/src/ReactFiberCommitWork.new.js +++ b/packages/react-reconciler/src/ReactFiberCommitWork.new.js @@ -879,8 +879,6 @@ function commitUnmount( if ((tag & HookPassive) !== NoHookEffect) { // TODO: Consider if we can move this block out of the synchronous commit phase effect.tag |= HookHasEffect; - - schedulePassiveEffectCallback(); } else { if ( enableProfilerTimer && diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js index 90d5b5edd8..7e6845f19a 100644 --- a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js +++ b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js @@ -2183,7 +2183,10 @@ function commitRootImpl(root, renderPriorityLevel) { } // If there are pending passive effects, schedule a callback to process them. - if ((finishedWork.subtreeTag & PassiveSubtreeTag) !== NoSubtreeTag) { + if ( + (finishedWork.subtreeTag & PassiveSubtreeTag) !== NoSubtreeTag || + (finishedWork.effectTag & PassiveMask) !== NoEffect + ) { if (!rootDoesHavePassiveEffects) { rootDoesHavePassiveEffects = true; scheduleCallback(NormalSchedulerPriority, () => {