За что отвечает массив зависимостей в useEffect?
Хуки
Массив зависимостей useEffect отвечает за расписание эффекта: он сообщает React, при изменении каких значений эффект нужно выполнить заново.
Три режима
useEffect(() => { ... }); // без массива: после каждого рендера
useEffect(() => { ... }, []); // пустой: один раз, после монтирования
useEffect(() => { ... }, [a, b]); // при монтировании и изменении a или bСравнение — поэлементное, через Object.is со значениями прошлого рендера. Перед каждым перезапуском выполняется cleanup предыдущего эффекта (и он же — при размонтировании).
Роль массива — «синхронизация»
Правильная ментальная модель: deps описывают, с какими данными синхронизирован эффект. [roomId] значит: «держи соединение с комнатой roomId; изменилась — переподключись (cleanup старого → эффект с новым)».
Типичные ошибки
- Пропущенные зависимости → эффект работает с устаревшими значениями (stale closure):
useEffect(() => {
const id = setInterval(() => send(message), 5000); // message «заморожен»
return () => clearInterval(id);
}, []); // ❌ message не указан- Нестабильные зависимости — объект/функция, создаваемые в рендере, → эффект перезапускается каждый рендер; лечится useMemo/useCallback, примитивами или переносом внутрь эффекта.
- Подавление ESLint exhaustive-deps вместо исправления причины.
Можно не указывать: сеттеры useState, dispatch, ref-объект — они стабильны.
Коротко для собеседования
Массив зависимостей определяет, когда эффект выполняется: отсутствует — каждый рендер, пустой — только монтирование, со значениями — при их изменении (Object.is), с cleanup перед каждым перезапуском. Список должен быть полным (иначе stale closures) и состоять из стабильных значений (иначе лишние перезапуски).