Чем отличаются виды зависимостей 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 стабильны и в массив не нужны.