Какие агрументы передаются в 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-сравнение решает, вернуть кеш или пересчитать). [] — единожды, без массива — каждый рендер. Сами аргументы в фабрику не передаются — она замыкает нужные значения.