Существует два типа обстоятельств: монтирование и обновление, поэтому useMemo имеет две реализации: mountMemo и 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; }
Объяснение:
На этапе монтирования функция useMemo вызывает функцию обратного вызова для вычисления и возврата значения. Сохраните значение и перейдите в Хук.memoizedState.
Используйте mountWorkInProgressHook для создания объекта-перехватчика.
Сохранить версии в nextDeps.
Вызовите nextCreate(), чтобы получить nextValue. Если вы находитесь в среде разработки, позвоните дважды.
Сохраните nextValue и nextDeps в хуке.memoizedState и верните 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; }
Объяснение:
На этапе обновления React оценит, изменились ли deps или нет. В случае изменения React запустит обратный вызов, чтобы получить новое значение и вернуться. Если не изменить, React вернет старое значение.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3