Il existe deux types de circonstances : le montage et la mise à jour, donc useMemo a deux implémentations : mountMemo et updateMemo.
function mountMemo( nextCreate: () => T, deps: Array | 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.
Enregistrer les dépôts dans les prochains Deps.
Appelez nextCreate() pour obtenir nextValue. Si vous êtes dans un environnement de développement, appelez deux fois.
Enregistrez la nextValue et nextDeps dans le hook.memoizedState et renvoyez nextValue.
function updateMemo( nextCreate: () => T, deps: Array | 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 | 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. Si cela n’est pas modifié, React renverra l’ancienne valeur.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3