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

Какие плюсы и минусы 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.

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