Добавление интерактивности¶
Некоторые элементы на экране обновляются в ответ на ввод пользователя. Например, щелчок по галерее изображений переключает активное изображение. В React данные, которые изменяются со временем, называются состояние. Вы можете добавить состояние в любой компонент и обновлять его по мере необходимости. В этой главе вы узнаете, как писать компоненты, которые обрабатывают взаимодействия, обновляют свое состояние и отображают различные результаты с течением времени.
В этой главе
- Как обрабатывать события, инициированные пользователем
- Как заставить компоненты "запоминать" информацию с помощью состояния
- Как React обновляет UI в два этапа
- Почему состояние не обновляется сразу после его изменения
- Как поставить в очередь несколько обновлений состояния
- Как обновить объект в состоянии
- Как обновить массив в состоянии
Реагирование на события¶
React позволяет добавлять обработчики событий в JSX. Обработчики событий - это ваши собственные функции, которые будут запускаться в ответ на действия пользователя, такие как нажатие, наведение курсора, фокусировка на вводе формы и так далее.
Встроенные компоненты, такие как <button>
, поддерживают только встроенные события браузера, такие как onClick
. Однако вы также можете создавать собственные компоненты и давать их атрибутам обработчиков событий любые имена, специфичные для конкретного приложения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
Готовы изучить эту тему?
Прочитайте Реакция на события, чтобы узнать, как добавлять обработчики событий.
Состояние: память компонента¶
Компоненты часто нуждаются в изменении того, что отображается на экране в результате взаимодействия. Ввод текста в форму должен обновить поле ввода, нажатие кнопки "next" на карусели изображений должно изменить отображаемое изображение, нажатие кнопки "buy" помещает товар в корзину. Компоненты должны "запоминать" вещи: текущее значение ввода, текущее изображение, корзину. В React такая память, специфичная для компонента, называется state..
Вы можете добавить состояние в компонент с помощью хука useState
. Хуки - это специальные функции, которые позволяют вашим компонентам использовать возможности React (состояние - одна из таких возможностей). Хук useState
позволяет вам объявить переменную состояния. Он принимает начальное состояние и возвращает пару значений: текущее состояние и функцию-установщик состояния, которая позволяет вам обновить его.
1 2 |
|
Вот как галерея изображений использует и обновляет состояние по щелчку мыши:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
|
Готовы изучить эту тему?
Прочитайте Состояние: память компонента, чтобы узнать, как запомнить значение и обновлять его при взаимодействии.
Рендеринг и фиксация¶
Прежде чем ваши компоненты будут отображены на экране, они должны быть отрендерены React. Понимание этапов этого процесса поможет вам задуматься о том, как выполняется ваш код, и объяснить его поведение.
Представьте, что ваши компоненты - это повара на кухне, собирающие вкусные блюда из ингредиентов. В этом сценарии React - это официант, который выполняет запросы клиентов и приносит им их заказы. Этот процесс запроса и подачи пользовательского интерфейса состоит из трех этапов:
- Триггер рендеринга (доставка заказа посетителя на кухню).
- Рендеринг компонента (подготовка заказа на кухне)
- Коммитирование в DOM (размещение заказа на столе)
Готовы изучить эту тему?
Прочитайте Рендеринг и фиксация, чтобы узнать о жизненном цикле обновления пользовательского интерфейса.
Состояние как моментальный снимок¶
В отличие от обычных переменных JavaScript, состояние в React ведет себя скорее как моментальный снимок. Его установка не изменяет уже имеющуюся переменную state, а вместо этого вызывает повторный рендеринг. Поначалу это может удивить!
1 2 3 |
|
Такое поведение поможет вам избежать мелких ошибок. Вот небольшое приложение для чата. Попробуйте угадать, что произойдет, если вы сначала нажмете "Отправить", а затем потом измените получателя на Боба. Чье имя появится в alert
пять секунд спустя?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
Готовы изучить эту тему?
Прочитайте Состояние как моментальный снимок, чтобы узнать, почему состояние кажется "фиксированным" и неизменным внутри обработчиков событий.
Постановка в очередь серии обновлений состояния¶
Этот компонент имеет ошибку: нажатие на "+3" увеличивает счет только один раз.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
Состояние как моментальный снимок объясняет, почему это происходит. Установка состояния запрашивает новый рендеринг, но не изменяет его в уже запущенном коде. Поэтому score
продолжает быть 0
сразу после вызова setScore(score + 1)
.
1 2 3 4 5 6 7 |
|
Это можно исправить, передав обновляющую функцию при установке состояния. Обратите внимание, как замена setScore(score + 1)
на setScore(s => s + 1)
исправляет кнопку "+3". Это позволяет поставить в очередь несколько обновлений состояния.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
Готовы изучить эту тему?
Читайте Постановка в очередь серии обновлений состояния, чтобы узнать, как поставить в очередь последовательность обновлений состояния.
Обновление объектов в состоянии¶
Состояние может содержать любые значения JavaScript, включая объекты. Но вы не должны изменять объекты и массивы, которые хранятся в состоянии React, напрямую. Вместо этого, когда вы хотите обновить объект или массив, вам нужно создать новый (или сделать копию существующего), а затем обновить состояние, чтобы использовать эту копию.
Обычно для копирования объектов и массивов, которые вы хотите изменить, используется синтаксис распространения ...
. Например, обновление вложенного объекта может выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
|
Если копирование объектов в коде становится утомительным, вы можете использовать библиотеку типа Immer для сокращения повторяющегося кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
|
Готовы изучить эту тему?
Прочитайте Обновление объектов в состоянии, чтобы узнать, как правильно обновлять объекты.
Обновление массивов в состоянии¶
Массивы - это еще один тип изменяемых объектов JavaScript, которые вы можете хранить в состоянии и должны рассматривать как доступные только для чтения. Как и в случае с объектами, когда вы хотите обновить массив, хранящийся в состоянии, вам нужно создать новый массив (или сделать копию существующего), а затем установить состояние для использования нового массива:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
|
Если копирование массивов в коде становится утомительным, вы можете использовать библиотеку типа Immer для сокращения повторяющегося кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
|
Готовы изучить эту тему?
Прочитайте Обновление массивов в состоянии, чтобы узнать, как правильно обновлять массивы.
Что дальше?¶
Перейдите по ссылке Реакция на события, чтобы начать читать эту главу страница за страницей!
Или, если вы уже знакомы с этими темами, почему бы не прочитать Управление состоянием?
Источник — https://react.dev/learn/adding-interactivity