From e52fa4c575e92b27d5d453829c7110bc5193f7a0 Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Tue, 13 Sep 2022 12:08:51 +0100 Subject: [PATCH] Add early exit to strict mode (#25235) --- packages/react-reconciler/src/ReactFiberWorkLoop.new.js | 5 +++++ packages/react-reconciler/src/ReactFiberWorkLoop.old.js | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js index 5e9edf7945..fa2e8bd3ec 100644 --- a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js +++ b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js @@ -3172,6 +3172,11 @@ function recursivelyTraverseAndDoubleInvokeEffectsInDEV( parentFiber: Fiber, isInStrictMode: boolean, ) { + if ((parentFiber.subtreeFlags & (PlacementDEV | Visibility)) === NoFlags) { + // Parent's descendants have already had effects double invoked. + // Early exit to avoid unnecessary tree traversal. + return; + } let child = parentFiber.child; while (child !== null) { doubleInvokeEffectsInDEV(root, child, isInStrictMode); diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.old.js b/packages/react-reconciler/src/ReactFiberWorkLoop.old.js index d8a0bc883f..57880c15e5 100644 --- a/packages/react-reconciler/src/ReactFiberWorkLoop.old.js +++ b/packages/react-reconciler/src/ReactFiberWorkLoop.old.js @@ -3172,6 +3172,11 @@ function recursivelyTraverseAndDoubleInvokeEffectsInDEV( parentFiber: Fiber, isInStrictMode: boolean, ) { + if ((parentFiber.subtreeFlags & (PlacementDEV | Visibility)) === NoFlags) { + // Parent's descendants have already had effects double invoked. + // Early exit to avoid unnecessary tree traversal. + return; + } let child = parentFiber.child; while (child !== null) { doubleInvokeEffectsInDEV(root, child, isInStrictMode);