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

Чем отличаются виды зависимостей Hooks и где они применяются?

Хуки

«Зависимости» у хуков (useEffect, useMemo, useCallback) работают одинаково механически, но роль массива различается — и от этого зависят паттерны применения.

Механика общая

Массив сравнивается поэлементно через Object.is со значениями прошлого рендера. Отличие есть → хук «перезапускается» (эффект выполняется / значение пересчитывается / функция пересоздаётся).

Виды зависимостей по типу значения

  • Примитивы (строки, числа, булевы) — идеальные зависимости: сравнение честное.
  • Объекты и массивы — сравниваются по ссылке; созданные в рендере — «всегда новые». Применение: мемоизировать (useMemo), разложить на примитивы (user.id вместо user) или перенести создание внутрь хука.
  • Функции — тоже ссылки; из тела компонента — нестабильны без useCallback. Функции-сеттеры из useState и dispatch из useReducer стабильны — их можно не указывать.
  • Ref-объект — стабилен; сам ref в зависимостях бессмыслен, а ref.current в зависимостях не работает (изменение не вызывает рендер, сравнивать нечего).

Роль массива в разных хуках

  • useEffect/useLayoutEffect: «когда синхронизироваться с внешней системой» — нет массива (каждый рендер), [] (монтирование), [deps] (по изменению).
  • useMemo: «когда пересчитать значение» — кеширование вычислений и стабильность ссылок.
  • useCallback: «когда пересоздать функцию» — стабильность колбэков для memo-детей и других хуков.

Практические правила

  • Полнота: все используемые реактивные значения — в массиве (ESLint exhaustive-deps); пропуск = устаревшие замыкания.
  • Минимизация: чем меньше и примитивнее зависимости, тем реже перезапуски.
  • Цепочки стабильности: useCallback у родителя питает memo-ребёнка и зависимости его эффектов.

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

Зависимости всех хуков сравниваются по Object.is, но роль разная: у useEffect — когда перезапускать синхронизацию, у useMemo — когда пересчитывать значение, у useCallback — когда пересоздавать функцию. Примитивы — надёжные зависимости; объекты/функции требуют мемоизации; сеттеры и ref стабильны и в массив не нужны.

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