PassFront
  1. PassFront
  2. База знаний
  3. Хуки

Какие агрументы передаются в UseMemo?

Хуки

В useMemo передаются два аргумента: функция-фабрика значения и массив зависимостей.

Сигнатура

const value = useMemo(
  () => computeSomething(a, b),  // 1) функция, ВОЗВРАЩАЮЩАЯ значение
  [a, b],                        // 2) массив зависимостей
);

Первый аргумент — функция-фабрика

  • Вызывается во время рендера, поэтому обязана быть чистой: никаких запросов, подписок, setState.
  • Возвращает значение, которое useMemo закеширует и вернёт: результат вычисления, объект, массив, JSX — что угодно.
  • Без аргументов: всё нужное берёт из замыкания (props/state).

Второй аргумент — массив зависимостей

  • Управляет пересчётом: при рендере элементы сравниваются с прошлыми через Object.is; все равны → возвращается кеш без вызова фабрики; отличие → фабрика вызывается заново.
  • Должен содержать все реактивные значения, используемые фабрикой (ESLint exhaustive-deps).
  • Крайние случаи: [] — вычислить один раз при монтировании; отсутствие массива — пересчёт каждый рендер (useMemo теряет смысл).

Что возвращает useMemo

Закешированное значение (не функцию его получения). Для мемоизации самой функции есть useCallback: useCallback(fn, deps) ≡ useMemo(() => fn, deps).

Типичные ошибки с аргументами

  • Передать значение вместо функции: useMemo(compute(a), [a]) — compute выполнится сразу и каждый рендер; нужно () => compute(a).
  • Забыть массив — молчаливая потеря мемоизации.
  • Нестабильные зависимости (инлайн-объекты) — кеш никогда не срабатывает.

Коротко для собеседования

Два аргумента: чистая функция-фабрика (вызывается в рендере, возвращает кешируемое значение) и массив зависимостей (Object.is-сравнение решает, вернуть кеш или пересчитать). [] — единожды, без массива — каждый рендер. Сами аргументы в фабрику не передаются — она замыкает нужные значения.

Другие вопросы раздела