Какие аргументы принимает useEffect?
Хуки
useEffect принимает два аргумента: функцию эффекта (обязательную) и массив зависимостей (необязательный).
Первый аргумент — функция эффекта
useEffect(() => {
document.title = `Сообщений: ${count}`; // сам эффект
return () => { document.title = 'App'; }; // необязательный cleanup
}, [count]);- Выполняется после коммита рендера (асинхронно относительно отрисовки).
- Может вернуть cleanup-функцию — она вызовется перед следующим запуском эффекта и при размонтировании.
- Не может быть async: обязана возвращать функцию или undefined, а async-функция возвращает Promise. Асинхронный код оформляют внутри.
Второй аргумент — массив зависимостей
Управляет тем, когда эффект перезапускается:
- отсутствует — после каждого рендера;
- `[]` — один раз, после монтирования;
- `[a, b]` — после монтирования и при изменении
aилиb(сравнение каждого элемента черезObject.isсо значением из прошлого рендера).
Правила для массива зависимостей
- В него должны попасть все реактивные значения, используемые внутри эффекта (props, state, функции из тела компонента) — за этим следит ESLint-правило
exhaustive-deps. - Пропущенная зависимость → эффект работает с устаревшими значениями (stale closure).
- Нестабильная зависимость (инлайн-объект/функция) → эффект перезапускается каждый рендер; лечится useMemo/useCallback или переносом внутрь эффекта.
Коротко для собеседования
Аргумента два: колбэк эффекта (выполняется после рендера, может вернуть cleanup, не может быть async) и массив зависимостей (нет — каждый рендер, пустой — раз при монтировании, со значениями — при их изменении по Object.is). В массиве обязаны быть все используемые реактивные значения.