Il existe deux types de circonstances : le montage et la mise à jour, donc useMemo a deux implémentations : mountMemo et updateMemo.
function mountMemo<T>( nextCreate: () => T, deps: Array<mixed> | void | null, ): T { const hook = mountWorkInProgressHook(); const nextDeps = deps === undefined ? null : deps; const nextValue = nextCreate(); if (shouldDoubleInvokeUserFnsInHooksDEV) { setIsStrictModeForDevtools(true); nextCreate(); setIsStrictModeForDevtools(false); } hook.memoizedState = [nextValue, nextDeps]; return nextValue; }
Explication :
Dans la phase de montage, la fonction useMemo appelle la fonction de rappel pour calculer et renvoyer la valeur. Enregistrez la valeur et les dépôts dans hook.memoizedState.
Utilisez mountWorkInProgressHook pour créer un objet hook.
Enregistrez les dépôts dans nextDeps.
Appelez nextCreate() pour obtenir nextValue. Si vous êtes dans un environnement de développement, appelez deux fois.
Enregistrez la nextValue et le nextDeps dans le hook.memoizedState et renvoyez la nextValue.
function updateMemo<T>( nextCreate: () => T, deps: Array<mixed> | void | null, ): T { const hook = updateWorkInProgressHook(); const nextDeps = deps === undefined ? null : deps; const prevState = hook.memoizedState; // Assume these are defined. If they're not, areHookInputsEqual will warn. if (nextDeps !== null) { const prevDeps: Array<mixed> | null = prevState[1]; if (areHookInputsEqual(nextDeps, prevDeps)) { return prevState[0]; } } const nextValue = nextCreate(); if (shouldDoubleInvokeUserFnsInHooksDEV) { setIsStrictModeForDevtools(true); nextCreate(); setIsStrictModeForDevtools(false); } hook.memoizedState = [nextValue, nextDeps]; return nextValue; }
Explication :
Dans la phase de mise à jour, React jugera si les dépôts ont changé ou non, s'ils sont modifiés, React exécutera le rappel pour obtenir la nouvelle valeur et reviendra. S'il n'est pas modifié, React renverra l'ancienne valeur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!