«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Исходный код useMemo:

Исходный код useMemo:

Опубликовано 8 ноября 2024 г.
Просматривать:909

The source code of useMemo:

Существует два типа обстоятельств: монтирование и обновление, поэтому useMemo имеет две реализации: mountMemo и updateMemo.

  • Исходный код mountMemo:

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.

  1. Используйте mountWorkInProgressHook для создания объекта-перехватчика.

  2. Сохранить версии в nextDeps.

  3. Вызовите nextCreate(), чтобы получить nextValue. Если вы находитесь в среде разработки, позвоните дважды.

  4. Сохраните nextValue и nextDeps в хуке.memoizedState и верните nextValue.

  • Исходный код updateMemo:

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 вернет старое значение.

  1. Получите новый объект-перехватчик: ловушка = updateWorkInProgressHook();
  2. если массив deps пуст, если (nextDeps !== null), вызывать функцию обратного вызова при каждом рендеринге и возвращать новое значение.
  3. Если массив deps не пуст, оцените, изменились deps или нет, если (areHookInputsEqual(nextDeps, prevDeps)). Если не изменилось, верните старое значение return prevState[0].
Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/clara1123/the-source-code-of-usememo-5akk?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3