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

За что отвечает массив зависимостей в 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) и состоять из стабильных значений (иначе лишние перезапуски).

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