Основы хука useEffect в React
Автор конспекта: Стогниева Виктория
Введение: Роль React и "Внешний Мир"🌍
Основная задача React — эффективное управление DOM-деревом (тем, что пользователь видит в браузере) на основе данных, которые мы называем состоянием (state).
React контролирует цикл "данные → разметка", но реальные приложения взаимодействуют с внешним миром, который включает:
- API браузера (
document.title,localStorage) - Сетевые запросы к серверам
- Таймеры (
setTimeout,setInterval) - Подписки на события
UseEffect — это инструмент для безопасного взаимодействия с внешним миром и синхронизации его с
состоянием приложения.
1.Что такое "Побочные Эффекты" (Side Effects)? ⚡
Побочный эффект — это любое взаимодействие с внешним миром, которое:
- ❌ Не является частью основного рендеринга
- 🌍 Выходит за пределы React-компонента
Классический пример — изменение заголовка вкладки браузера (document.title). Это побочный
эффект, потому что тег title находится в head части HTML-документа, а React управляет только
содержимым одного корневого элемента (обычно <div id="root">).
UseEffect — единственный правильный способ управления побочными эффектами в функциональных
компонентах.
2. Как работает useEffect: Ключевые концепции 🔧
Основная идея
UseEffect синхронизирует программу с внешним миром. React решает, когда выполнить эффект.
Различие понятий
- Хук
useEffect— вызывается при каждом рендере - Функция-эффект —
callback, который создается при каждом рендере, но запускается только при изменении зависимостей
⏱ Время выполнения
Эффект выполняется после обновления DOM:
- React вызывает ваш компонент.➡️
- Компонент возвращает новый
JSX.➡️ - React сравнивает новый
JSXсо старым, обновляет DOM.➡️ - Пользователь видит обновленный интерфейс.➡️
- React запускает вашу функцию-эффект.➡️ Это гарантирует, что код эффекта не будет блокировать отрисовку интерфейса.
3. Управление запуском эффекта: массив зависимостей 🎛
Второй аргумент useEffect — массив зависимостей — это инструкция для React. С её
помощью мы сообщаем, при изменении каких данных нужно перезапускать наш эффект.
3.1. 🔄 Эффект после каждого рендера (без массива)
3.2. ✅ Эффект только при монтировании (пустой массив)
Важно: мыслите зависимостями, а не жизненным циклом!
4. Практический пример: Счетчик в заголовке страницы 🧪
Пример с одним счетчиком
Пример с двумя счетчиками
Вопрос: что произойдет с заголовком, если нажать на вторую кнопку (Increment 2)?
Ответ: заголовок НЕ изменится. Поскольку useEffect теперь зависит только от counter (указан
в массиве зависимостей), изменение counter2 не вызовет перезапуск эффекта. Эффект обновляет
заголовок только когда меняется counter.
5. Ключевые выводы 💡
UseEffectдля синхронизации: используйте этот хук для синхронизации вашего компонента с системами внеReact.- Мыслите зависимостями: поведение
useEffectполностью определяется массивом зависимостей. - Эффект запускается ПОСЛЕ рендера: пользователь сначала видит обновленный интерфейс, и потом
выполняется код внутри
useEffect. - Отсутствие зависимостей = запуск при каждом рендере: это правило приводит к лишним вычислениям и проблемам с производительностью.
- Основная идея хуком
useEffect— не просто «выполнить какой-то код после рендера», а синхронизация состоянияReactс внешним миром.
6. Важные нюансы и частые ошибки ⚠️
6.1. Почему React использует именно новую функцию?
Каждый раз мы передаем в useEffect новую функцию, чтобы она могла работать с актуальными данными.
6.2. Осторожно: горячая перезагрузка (Hot Reload)
Горячая перезагрузка может заставить useEffect сработать при сохранении файла в редакторе.
Рекомендуется очищать кэш при отладке.
6.3. Правило: не меняйте состав зависимостей
React строго следит за стабильностью количества элементов в массиве зависимостей.
6.4. Как называть функцию внутри useEffect?
Callback-функция (callback)— общий термин для функции, передаваемой в другую функцию.Setup-функция (setup)— «настраивает» эффект.Эффект (effect)— название, используемое в официальныхTypeScript-типах дляReact. Всё это относится к одной и той же функции.
7. Практический пример: загрузка данных по клику 🎧
Эффекты:
- Первый
useEffectиспользуется для загрузки списка треков изAPIпри монтировании компонента. Данные загружаются с помощьюFetch API, и полученные треки устанавливаются в состояниеtracks. - Второй
useEffectсрабатывает каждый раз, когда изменяетсяselectedTrackId. Он загружает детали выбранного трека, используя егоIDдля нового запроса кAPI.
Заключение: useEffect — это мощный инструмент для управления побочными эффектами. Ключ к его
правильному использованию лежит в понимании его основной задачи — синхронизации.
🏠 Домашнее задание
Цель задания:
Сформировать глубокое понимание работы хука useEffect в React и научиться применять его для
взаимодействия с внешним миром (API, браузерные API, таймеры).
1. Теория: закрепление основ
Ответь на вопросы:
- Что такое побочный эффект в React?
- Почему побочные эффекты нельзя вызывать прямо в теле компонента?
- Когда именно запускается функция из
useEffect?
2. Поведение useEffect
Задание 2.1: Предскажи, что произойдет в этих случаях:
Для каждого варианта опиши:
- Сколько раз сработает эффект?
- В какие моменты?
3. Практика с простыми компонентами
Создай компонент InputTitle, в котором:
- Есть поле ввода (
input), куда пользователь вводит текст. - С помощью
useEffectсделай так, чтобы заголовок вкладки (document.title) всегда показывал введённое значение. - Пока ничего не ведено в
inputпоказывай текст по умолчанию ('Введите текст')
Итоговый результат 🚀

4. Практика на основе App.tsx
Продолжай работать в проекте с предыдущих домашних заданий.
Создай новый useEffect и вынеси в него логики из onClick при выборе задачи
🔶 При попытке вынеси логику в useEffect ты обнаружишь, что помимо selectedTaskId, еще нужно
знать boardId 🤔
🔶 Поэтому в данной задаче нам придется добавить еще один useState для хранения boardId и при
клике сетать новое значение boardId
Итоговый результат 🚀 Все должно работать так же как и до вынесения логики в useEffect
🔶 Помни: каждая задача в этом ДЗ основана на реальных сценариях из веб-разработки.
🔶Экспериментируй: пробуй разные варианты зависимостей в useEffect и наблюдай за результатами.
🔶Удачи! Чем больше практики — тем ближе ты к уверенной работе с React. 🚀


