Вопрос проверяет понимание зависимостей useEffect и замыканий в React.
Чаще всего забывают добавлять зависимости, что приводит к устаревшим данным, или наоборот — добавляют лишние, вызывая лишние эффекты. Также распространена ошибка с функциями и объектами, которые пересоздаются на каждом рендере. Всё это может приводить к race condition и багам, которые сложно отлаживать. Правильная работа с зависимостями — один из ключевых навыков React-разработчика.
useEffect всегда работает с теми значениями, которые были доступны в момент его создания.
useEffect(() => {
fetch(`/api/user/${id}`);
}, []); // ❌ id используется, но не указан
Проблемы:
Используется устаревшее значение
Эффект не реагирует на изменения
Поведение становится неочевидным
useEffect(() => {
fetchData();
}, [fetchData]); // fetchData пересоздаётся каждый рендер
Проблемы:
Эффект запускается слишком часто
Возможны лишние запросы
useEffect(() => {
fetchData(filters);
}, [filters]);
Если filters создаётся заново:
React считает его изменённым
Эффект перезапускается
Использовать useCallback и useMemo
Следовать рекомендациям eslint-plugin-react-hooks
Понимать, какие значения реально должны быть в зависимостях
Ошибки в зависимостях useEffect — одна из самых частых причин багов в React. Понимание замыканий и зависимостей напрямую влияет на стабильность асинхронного кода.