Какие плюсы и минусы useEffect?
Хуки
useEffect — мощный, но опасный инструмент: он даёт доступ к внешнему миру и одновременно порождает большую часть багов в React-коде.
Плюсы
- Единый механизм вместо трёх методов жизненного цикла: подписка и отписка живут рядом, логика группируется по ресурсу.
- Автоматическая синхронизация по зависимостям: не нужно вручную сравнивать prevProps — React перезапускает эффект сам.
- Гарантированная очистка: cleanup вызывается перед каждым перезапуском и при размонтировании — меньше утечек.
- Не блокирует отрисовку: выполняется после кадра (для «до кадра» есть useLayoutEffect).
- Легко выносится в кастомные хуки и переиспользуется.
Минусы
- Устаревшие замыкания: пропущенная зависимость — и эффект работает с данными старого рендера; ловится не сразу.
- Нестабильные зависимости: объект/функция из рендера перезапускают эффект каждый раз — бесконечные запросы.
- Гонки запросов: без отмены (AbortController/флаг) поздний ответ старого запроса перезаписывает актуальные данные.
- Асинхронность неудобна: колбэк не может быть async — нужна внутренняя IIFE.
- Двойной прогон в StrictMode (dev) сбивает с толку новичков.
- Переиспользование не по назначению: эффекты для вычислений из props/state и обработки событий — лишние рендеры и запутанная причинность («You Might Not Need an Effect»).
Практический вывод
Эффект — для синхронизации с внешними системами. Производные данные — useMemo/рендер, действия пользователя — обработчики, серверные данные — React Query. Тогда минусы почти не проявляются.
Коротко для собеседования
Плюсы: один механизм вместо трёх методов, автоматическая пересинхронизация по deps, гарантированный cleanup, неблокирующее выполнение. Минусы: stale closures, нестабильные зависимости, гонки запросов, невозможность async-колбэка, двойной прогон в StrictMode и соблазн использовать эффект там, где нужны useMemo/обработчик/React Query.