Магия useEffect: от первых шагов до уверенного кода
Понятие побочных эффектов
Что такое побочные эффекты?
Основная задача компонента React — отображать пользовательский интерфейс. Он работает как простая функция: получает на вход данные (пропсы) и возвращает на выход JSX-разметку, которую нужно отрисовать. Этот процесс называется рендерингом.
Пропсы → Компонент → Пользовательский интерфейс (UI)
В идеальном мире это всё, чем должен заниматься компонент. Такие функции, которые при одинаковых входных данных всегда возвращают одинаковый результат и не влияют ни на что за пределами себя, называются чистыми функциями . Представьте себе повара в ресторане. Его основная работа — готовить блюдо по рецепту (компонент) из предоставленных продуктов (пропсы). Результат — готовое блюдо (UI).
Но что, если во время готовки повару нужно позвонить поставщику, чтобы заказать еще продуктов? Или включить таймер? Это уже не часть основного рецепта. В React такие действия, выходящие за рамки простого рендеринга, называются побочными эффектами (side effects).
Побочные эффекты — это любое взаимодействие с внешним миром из вашего компонента. Например, загрузка данных, подписка на события, работа с таймерами или прямое изменение DOM.
Почему это проблема?
Выполнять побочные эффекты прямо в теле компонента — плохая идея. React может вызывать функцию вашего компонента (то есть, проводить рендеринг) много раз и по разным причинам. Если побочный эффект находится прямо там, он будет запускаться при каждом рендеринге.
Представьте, что вы запрашиваете данные с сервера прямо в теле компонента.
- Компонент рендерится в первый раз, отправляется запрос на сервер.
- Данные приходят, вы обновляете состояние компонента.
- Обновление состояния вызывает повторный рендеринг.
- Компонент рендерится снова, и... опять отправляется запрос на сервер!
Это создает бесконечный цикл запросов, что замедляет приложение и нагружает сервер.
Еще одна проблема — блокировка рендеринга. Если ваш побочный эффект — это долгая операция (например, сложный расчет или медленный сетевой запрос), весь интерфейс «зависнет» в ожидании ее завершения. Пользователь не сможет взаимодействовать со страницей, пока операция не закончится. Это создает очень плохой пользовательский опыт.
Наконец, React использует концепцию «виртуального », чтобы эффективно обновлять страницу. Прямое изменение DOM из компонента нарушает этот механизм. React теряет контроль над тем, что отображается на экране, что приводит к ошибкам и непредсказуемому поведению.
По этим причинам React предоставляет специальный инструмент для управления побочными эффектами, который позволяет выполнять их в нужный момент, не мешая основному процессу рендеринга. Этот инструмент называется хук useEffect, и мы рассмотрим его в следующем разделе.
Что такое «побочный эффект» (side effect) в контексте компонента React?
Почему выполнение запроса данных (например, fetch) непосредственно в теле функции компонента является плохой практикой?
Теперь вы знаете, что такое побочные эффекты и почему их нужно изолировать от логики рендеринга.