From bd13426453866c50b27a813d26e9396aa34dbf8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Fri, 15 Apr 2022 11:23:27 +0200 Subject: [PATCH] Recycle prevProps in simple memo based on the `shallowEqual` check --- packages/react-reconciler/src/ReactFiberBeginWork.new.js | 6 +++++- packages/react-reconciler/src/ReactFiberBeginWork.old.js | 6 +++++- packages/react-reconciler/src/__tests__/ReactMemo-test.js | 6 ++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.new.js b/packages/react-reconciler/src/ReactFiberBeginWork.new.js index ace4f1b4c708..096e3d1cfc3d 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.new.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.new.js @@ -592,7 +592,11 @@ function updateSimpleMemoComponent( } if (current !== null) { const prevProps = current.memoizedProps; - nextProps = shallowEqual(prevProps, nextProps) ? prevProps : nextProps; + // potentially recycle `prevProps` if they are the same + // this allows hooks depending on the `props` to be reused + workInProgress.pendingProps = nextProps = shallowEqual(prevProps, nextProps) + ? prevProps + : nextProps; if ( prevProps === nextProps && current.ref === workInProgress.ref && diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.old.js b/packages/react-reconciler/src/ReactFiberBeginWork.old.js index a22e3b377ced..1377ed13de31 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.old.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.old.js @@ -592,7 +592,11 @@ function updateSimpleMemoComponent( } if (current !== null) { const prevProps = current.memoizedProps; - nextProps = shallowEqual(prevProps, nextProps) ? prevProps : nextProps; + // potentially recycle `prevProps` if they are the same + // this allows hooks depending on the `props` to be reused + workInProgress.pendingProps = nextProps = shallowEqual(prevProps, nextProps) + ? prevProps + : nextProps; if ( prevProps === nextProps && current.ref === workInProgress.ref && diff --git a/packages/react-reconciler/src/__tests__/ReactMemo-test.js b/packages/react-reconciler/src/__tests__/ReactMemo-test.js index 7dd0b84609d9..5169767f8227 100644 --- a/packages/react-reconciler/src/__tests__/ReactMemo-test.js +++ b/packages/react-reconciler/src/__tests__/ReactMemo-test.js @@ -222,6 +222,12 @@ describe('memo', () => { expect(ReactNoop.getChildren()).toEqual([ span('Inner render count: 1'), ]); + + ReactNoop.render(); + expect(Scheduler).toFlushAndYield([]); + expect(ReactNoop.getChildren()).toEqual([ + span('Inner render count: 1'), + ]); }); it('accepts custom comparison function', async () => {