Skip to content

Commit 6bec011

Browse files
committed
[Fiber] Ensure Effect events read latest values in forwardRef and memo() Components
1 parent 6d510c3 commit 6bec011

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

packages/react-reconciler/src/ReactFiberCommitWork.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,9 @@ function commitBeforeMutationEffectsOnFiber(
493493
}
494494

495495
switch (finishedWork.tag) {
496-
case FunctionComponent: {
496+
case FunctionComponent:
497+
case ForwardRef:
498+
case SimpleMemoComponent: {
497499
if (enableUseEffectEventHook) {
498500
if ((flags & Update) !== NoFlags) {
499501
const updateQueue: FunctionComponentUpdateQueue | null =
@@ -510,10 +512,6 @@ function commitBeforeMutationEffectsOnFiber(
510512
}
511513
break;
512514
}
513-
case ForwardRef:
514-
case SimpleMemoComponent: {
515-
break;
516-
}
517515
case ClassComponent: {
518516
if ((flags & Snapshot) !== NoFlags) {
519517
if (current !== null) {

packages/react-reconciler/src/__tests__/useEffectEvent-test.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -887,6 +887,45 @@ describe('useEffectEvent', () => {
887887
assertLog(['ContextReader: second']);
888888

889889
logContextValue();
890+
assertLog(['ContextReader (Effect event): second']);
891+
});
892+
893+
it('reads the latest context value in forwardRef Components', async () => {
894+
const MyContext = createContext('default');
895+
896+
let logContextValue;
897+
const ContextReader = React.forwardRef(function ContextReader(props, ref) {
898+
const value = useContext(MyContext);
899+
Scheduler.log('ContextReader: ' + value);
900+
const fireLogContextValue = useEffectEvent(() => {
901+
Scheduler.log('ContextReader (Effect event): ' + value);
902+
});
903+
useEffect(() => {
904+
logContextValue = fireLogContextValue;
905+
}, []);
906+
return null;
907+
});
908+
909+
function App({value}) {
910+
return (
911+
<MyContext.Provider value={value}>
912+
<ContextReader />
913+
</MyContext.Provider>
914+
);
915+
}
916+
917+
const root = ReactNoop.createRoot();
918+
await act(() => root.render(<App value="first" />));
919+
assertLog(['ContextReader: first']);
920+
921+
logContextValue();
922+
890923
assertLog(['ContextReader (Effect event): first']);
924+
925+
await act(() => root.render(<App value="second" />));
926+
assertLog(['ContextReader: second']);
927+
928+
logContextValue();
929+
assertLog(['ContextReader (Effect event): second']);
891930
});
892931
});

0 commit comments

Comments
 (0)