有兩種情況:mount和update,所以useMemo有兩種實作:mountMemo和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; }
說明:
在掛載階段,useMemo函數呼叫回呼函數計算並傳回值。將值和依賴項儲存到 hook.memoizedState 中。
使用 mountWorkInProgressHook 建立鉤子物件。
將 deps 保存在 nextDeps 中。
呼叫nextCreate()取得nextValue。如果在開發環境中,請呼叫兩次。
將 nextValue 和 nextDeps 保存在 hook.memoizedState 中並傳回 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; }
說明:
在更新階段,React 會判斷 deps 是否發生變化,如果發生變化,React 將運行回呼以取得新值並返回。如果不更改,React 將傳回舊值。
以上是useMemo的原始碼:的詳細內容。更多資訊請關注PHP中文網其他相關文章!