Перейти к содержимому
Учи.Онлайн Выбрать школу
Статья

Хуки React: состояние, эффекты и учебная практика

Хуки помогают функциональному компоненту React хранить состояние и связывать интерфейс с происходящим вокруг него. С их помощью поле запоминает введённый текст, кнопка меняет выбранный вариант, а компонент синхронизирует работу с внешней системой. За короткими вызовами useState и useEffect стоят разные задачи, и обучение становится понятнее, когда эта разница видна на небольших примерах. Сначала полезно представить обычный интерфейс: пользователь изменяет значение, React пересчитывает описание экрана, и человек видит новый результат. Состояние хранит сведения, необходимые для этого пересчёта. Эффект нужен в другой ситуации — когда после изменения интерфейса требуется согласовать работу с чем-то за пределами самого вычисления разметки.

Автор: редакция Учи.ОнлайнОтветственный редактор: Дмитрий Игнатьев
Содержание
Рабочее место разработчика с условным интерфейсом и карточками состояний компонента

Как состояние связано с новым отображением

Переменная состояния содержит значение для конкретного отображения компонента. Вызов функции обновления сообщает React о следующем состоянии, после чего компонент получает возможность отобразиться с новыми данными. Поэтому состояние рассматривают вместе с тем, какая информация действительно влияет на экран.

Например, счётчик хранит количество выбранных элементов. Когда пользователь добавляет ещё один, новое значение должно отразиться в тексте и, возможно, в доступности кнопки. Эти части интерфейса читают одни и те же данные, поэтому их поведение связано с общим состоянием.

Обычная локальная переменная внутри функции решает другую задачу. Она может участвовать в вычислении во время текущего вызова, но её изменение само по себе не сообщает React о необходимости нового отображения. Это различие помогает понять, зачем в компоненте выделяется состояние и почему оно имеет отдельный способ обновления.

Почему обновление не меняет уже выполняющийся код

Во время обработки события код работает со значениями текущего отображения. Если несколько раз передать одно и то же рассчитанное новое число, это не превращается автоматически в несколько последовательных прибавлений. Для расчёта от предыдущего состояния существует форма обновления через функцию.

В таком фрагменте компонента каждая функция получает очередное значение и прибавляет единицу:

const [count, setCount] = useState(0);

function addTwo() {
  setCount(value => value + 1);
  setCount(value => value + 1);
}

После обработки этих обновлений исходный ноль превращается в два. Связь между шагами выражена явно: второй расчёт продолжает первый. Такой пример помогает освоить очередь обновлений и не ожидать, что переменная count изменится прямо посреди уже выполняющегося обработчика.

Когда состояние содержит объект или массив, обновление обычно создаёт новое значение с нужным изменением. Например, выбранный пункт можно заменить в новой копии списка, сохранив остальные элементы. Это помогает связать изменение данных с очередным состоянием и не менять объект, который уже использовался предыдущим отображением.

Когда нужен эффект

Эффект используется для синхронизации с внешней системой. Это может быть подписка на событие браузера, соединение или управление сторонним виджетом. В документации React этот смысл рассматривается отдельно от вычисления интерфейса и обработки пользовательского события.

Например, компонент может отражать выбранное значение в заголовке вкладки. Сам заголовок находится за пределами разметки компонента, поэтому его обновление связывается с текущим состоянием:

useEffect(() => {
  document.title = `Выбрано: ${count}`;
}, [count]);

Зависимость count показывает, с каким значением связано выполнение синхронизации. Если изменяется источник данных для эффекта, его работа должна учитывать это изменение. Понимание этой связи помогает читать код через назначение действия, а не воспринимать массив зависимостей как случайный набор имён.

Как изучают хуки в работающем приложении

Курс «React-разработчик» в Яндекс Практикуме связывает хуки с созданием собственного веб-приложения. Программа рассчитана на слушателей с основами JavaScript, HTML и CSS и навыками работы с Git и npm. Эта база позволяет сосредоточиться на логике компонентов и работе с данными.

Открыть курс React-разработчика

В обучении есть хуки, управление состоянием, TypeScript и тестирование. Проектная работа помогает увидеть их связь: состояние влияет на интерфейс, событие меняет данные, а проверка показывает ожидаемое поведение. Благодаря этому отдельный приём осваивается как часть приложения, которое должно последовательно работать при разных действиях пользователя.

Как отличают вычисление от синхронизации

Не каждое изменение данных требует эффекта. Если значение можно получить из уже имеющихся свойств и состояния при отображении, оно часто относится к обычному вычислению. Например, сумма цен выбранных товаров зависит от содержимого корзины и может быть рассчитана из этих данных.

Сохранение такой суммы в отдельном состоянии создаёт ещё одну величину, которую приходится согласовывать с корзиной. Для учебного разбора это полезный вопрос: действительно ли нужно хранить новое значение или достаточно вычислить его из существующего. Понятный ответ делает код короче по смыслу и уменьшает количество связей, за которыми приходится следить.

У эффекта при этом остаётся собственное назначение. Если приложение подписывается на события внешнего источника, работа выходит за пределы пересчёта разметки. Умение различать эти ситуации помогает объяснить, почему выбран конкретный инструмент и что произойдёт при изменении данных.

Зачем нужна очистка подписки

Некоторые эффекты начинают действие, которое продолжается во времени. Например, компонент слушает изменения размера окна. Если такая подписка больше не нужна, её необходимо завершить, иначе старый обработчик может продолжать работу после изменения условий или удаления компонента.

Функция очистки связывается с той подпиской, которая была создана при выполнении эффекта. Это делает жизненный цикл действия понятным: начать синхронизацию в известных условиях и закончить её, когда эти условия перестают действовать. В учебной практике особенно полезно наблюдать эту последовательность при повторном показе компонента.

В режиме разработки React может дополнительно проверять корректность организации эффекта. Поэтому повторный запуск в соответствующем режиме сам по себе ещё не объясняет наличие ошибки. Внимание направляется на то, правильно ли связаны начало действия, зависимости и его завершение.

Инструмент или действие Какую задачу разбирают
useState Хранение значения, влияющего на интерфейс
Функция обновления Расчёт нового состояния из предыдущего
useEffect Согласование с внешней системой
Зависимости Условия актуальности синхронизации
Очистка Завершение начатого эффекта

Как правила вызова помогают сохранять понятную структуру

useState и useEffect вызывают на верхнем уровне компонента или собственного хука. Их не помещают внутрь обычного условия или обработчика события. Такая организация сохраняет последовательность вызовов, с которой React связывает состояние и другую информацию о компоненте.

Когда требуется условное действие, условие может относиться к содержанию эффекта или к поведению обработчика. Сам вызов хука при этом остаётся в предусмотренном месте. Разделение становится яснее на примере: решение о том, делать ли внешнее действие, отличается от организации хука внутри компонента.

Собственный хук позволяет вынести повторяющуюся логику в отдельную функцию. Он не объединяет автоматически состояние всех использующих его компонентов: каждый вызов участвует в работе своего экземпляра. Поэтому повторное использование логики рассматривается отдельно от совместного хранения данных в приложении.

Что даёт практика на небольших компонентах

Небольшой счётчик, форма или список позволяют видеть последствия каждого изменения. Понятно, какое событие произошло, что обновилось в состоянии и какая часть экрана изменилась. Такая прозрачность помогает освоить основную логику прежде, чем она встретится внутри большого проекта.

Далее те же связи становятся частью более сложного приложения. Слушатель может объяснить, почему значение хранится в определённом компоненте, зачем существует эффект и что проверяет тест. Это создаёт основу для дальнейшей работы с состоянием, включая задачи, которым посвящена статья о Redux и Redux Toolkit.