[Fresh] Always reset useMemoCache on Fast Refresh (#30700)

Stacked on https://github.com/facebook/react/pull/30662.

Alternative to https://github.com/facebook/react/pull/30663 and
https://github.com/facebook/react/pull/30677.

During a Fast Refresh, we always want to evict the memo cache, same as
we do with normal `useMemo`. The mechanism used by `useMemo` and other
Hooks is this module-level variable:


fca5d655d7/packages/react-reconciler/src/ReactFiberHooks.js (L304-L307)

which has DEV-only behavior as if the dependencies are always different:


fca5d655d7/packages/react-reconciler/src/ReactFiberHooks.js (L451-L460)

The `useMemoCache` Hook doesn't use a dependency array but conceptually
I think we want the same behavior.

## Test Plan

The test passes.

---------

Co-authored-by: Lauren Tan <poteto@users.noreply.github.com>
This commit is contained in:
dan
2024-08-15 01:02:29 +01:00
committed by GitHub
parent d9eb1540e2
commit 7e8a06cf4c
2 changed files with 2 additions and 3 deletions

View File

@@ -1226,7 +1226,7 @@ function useMemoCache(size: number): Array<any> {
updateQueue.memoCache = memoCache;
let data = memoCache.data[memoCache.index];
if (data === undefined) {
if (data === undefined || (__DEV__ && ignorePreviousDependencies)) {
data = memoCache.data[memoCache.index] = new Array(size);
for (let i = 0; i < size; i++) {
data[i] = REACT_MEMO_CACHE_SENTINEL;

View File

@@ -1637,8 +1637,7 @@ describe('ReactFreshIntegration', () => {
}
});
// eslint-disable-next-line jest/no-disabled-tests
it.skip('resets useMemoCache cache slots', async () => {
it('resets useMemoCache cache slots', async () => {
if (__DEV__) {
await render(`
const useMemoCache = require('react/compiler-runtime').c;