Es gibt zwei Arten von Umständen: Mounten und Aktualisieren, daher hat useMemo zwei Implementierungen: mountMemo und 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; }
Erläuterung:
In der Mount-Phase ruft die Funktion useMemo die Callback-Funktion auf, um den Wert zu berechnen und zurückzugeben. Speichern Sie den Wert und deps in Hook.memoizedState.
Verwenden Sie mountWorkInProgressHook, um ein Hook-Objekt zu erstellen.
Speichern Sie die Deps in den nächsten Deps.
Rufen Sie nextCreate() auf, um nextValue zu erhalten. Wenn Sie sich in einer Entwicklungsumgebung befinden, rufen Sie zweimal auf.
Speichern Sie nextValue und nextDeps im Hook.memoizedState und geben Sie nextValue zurück.
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; }
Erläuterung:
In der Aktualisierungsphase beurteilt React, ob sich die Deps geändert haben oder nicht. Bei Änderungen führt React den Rückruf aus, um den neuen Wert abzurufen und zurückzukehren. Wenn nicht geändert, gibt React den alten Wert zurück.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3