Hello World, в этой статье мы рассмотрим, как управлять состояниями в нашем React-приложении с помощью хука useState
.
К моменту завершения чтения статьи вы должны быть в состоянии
- Понимать
state
- Как реализовать хук
useState
- Как обновлять
state
в вашем приложении, а также некоторые правила использования хукаuseState
.
Давайте начнем.
- Понимание состояния в React
- Использование состояния в компоненте
- Отображение состояния в нашем пользовательском интерфейсе
- Изменение состояния в React.
- Повторное отображение компонента при изменении состояния.
- Исследование «реактивности» в обычных переменных
- Состояния должны быть реактивными
- Обновление компонента с новыми данными.
- Что такое хук useState?
- Синтаксис для крючка useState
- Как использовать хук useState
- Под капотом хука useState
- Чтение переменной состояния
- Обновление состояния с помощью функции Setter
- Добавление нескольких переменных состояния в компонент
- Использование объектов в качестве переменных состояния
- Обновление состояния на основе предыдущего состояния
- Где вызывать хук useState()
- Подведение итогов
Понимание состояния в React
Состояние — это данные или значения, которые могут быть изменены в нашем приложении. Оно описывает состояние нашего приложения в любой момент времени.
Поскольку мы создаем динамические веб-приложения на React, мы ожидаем, что данные (информация) в нашем приложении будут меняться в ответ на действия пользователя.
Такими действиями могут быть:
- щелчок по кнопке
- ввод значения в поле формы
- отправка формы.
- Нажатие на следующую кнопку в карусели изображений.
Каждый раз, когда state
(данные или информация) изменяется в React, компонент будет перерисовываться и отображать обновленную информацию на экране в результате вышеуказанных взаимодействий.
Состояние может быть любого типа данных, это может быть object
, array
, string
, boolean
и т.д.
Приведенный ниже код демонстрирует, как использовать состояние в компоненте.
Использование состояния в компоненте
import React from "react"
import "./styles.css";
export default function App() {
// defining a regular variable
const userMsg = "Start learning React Hooks";
return (
<div className="App">
<h1>Hello User</h1>
<h2>{userMsg}</h2>
<button>Get Started </button>
</div>
);
}
В приведенном выше коде:
- Мы определили «обычную» переменную
userMsg
, которую мы будем называть переменнойstate
(пока). - Затем мы присваиваем некоторое значение
userMsg
. - В нашем JSX шаблоне мы выводим информацию, хранящуюся в
userMsg
следующим образом{userMsg}
. - Таким образом, мы сохраняем значение (состояние) между вызовами функций. При любой перезагрузке приложения мы будем видеть на экране значение, сохраненное в
userMsg
.
Отображение состояния в нашем пользовательском интерфейсе
С помощью приведенного выше кода при запуске нашего приложения мы должны увидеть на экране следующее:
Hello User
Start learning React Hooks
Изменение состояния в React.
Обычно мы хотим, чтобы состояние (данные или информация) на пользовательском интерфейсе изменялось, когда в приложении происходит событие. Например, пользователь нажимает на кнопку.
Давайте рассмотрим, как изменить состояние в нашем приложении.
-
Мы хотим, чтобы состояние (значение или данные) изменилось с
Начало изучения React Hooks
наУрок первый: React useState Hook
, когда пользователь нажимает на кнопкуGet Started
. -
Мы объявили функцию
handleUserMsg
, которая будет отвечать за обновление значения при нажатии на кнопкуGet Started
. -
Функция
handleUserMsg
будет вызвана, и в теле функции мы присвоим новое значение переменнойuserMsg
.
Смотрите код ниже
import React from "react";
import "./styles.css";
export default function App() {
// defining a regular variable
const userMsg = "Start learning React Hooks";
const handleUserMsg = () => {
// assigning a new value to the variable
userMsg = "Lesson one: React useState Hook"
};
return (
<div className="App">
<h1>Hello User</h1>
{/* using the state */}
<h2>{userMsg}</h2>
<button onClick={handleUserMsg}>Get Started</button>
</div>
);1
}
Что происходит в приведенном выше коде:
- При нажатии кнопки «Get Started» вызывается функция
handleUserMsg
, иLesson one: React useState Hook
теперь присваивается переменнойuserMsg
. - Таким образом, мы обновили значение (так мы учились присваивать новое значение переменной в JavaScript).
Повторное отображение компонента при изменении состояния.
Когда мы присваиваем новое значение нашей переменной state
в React, наше приложение должно будет перезагрузиться (перерендериться), чтобы отобразить обновленные данные (информацию).
В приведенном выше коде:
- Мы назначили
Lesson one: React useState Hook
переменнойuserMsg
при выполнении функцииhandleUserMsg
. - Когда вызывается функция
handleUserMsg
, состояние (данные или значение изменились), и мы будем ожидать, что браузер сделает повторный рендеринг для вывода приведенного ниже кода на пользовательский интерфейс:
Hello User
Lesson one: React useState Hook
Примечание: Но этого не происходит, давайте выясним почему в следующем разделе.
Исследование «реактивности» в обычных переменных
Даже если мы ожидаем, что браузер выведет последние данные, присвоенные переменной userMsg
, нажатие кнопки Get Started
не обновляет состояние (данные) от Начало изучения React Hooks
до Урок первый: React useState Hook
.
Мы можем фактически доказать новое состояние Урок первый: React useState Hook
было присвоено userMsg
.
Обработчик события handleUserMsg()
обновляет регулярную переменную userMsg
. Однако изменение не видно из-за следующего:
- Переменная
userMsg
, объявленная выше, считается «обычной» переменной, а «обычные» переменные не переносятся между рендерами. - При повторном рендеринге компонент не учитывает новые значения, присвоенные обычным переменным.
- Следовательно, любое обновление «обычных» переменных не вызовет рендеринга (React не понимает, что ему нужно снова рендерить компонент с новым значением).
Состояния должны быть реактивными
Значение, хранящееся в переменной userMsg
, изменилось, но это изменение не отражается на пользовательском интерфейсе.
*Это происходит потому, что значение, хранящееся в переменной userMsg
, является только обычной переменной, а не реактивной. *
Это означает следующее:
- React не отслеживает изменения обычной переменной.
- Когда значение изменяется, это не приводит к тому, что React перерисовывает компонент, чтобы отразить обновление.
- Следовательно, мы продолжаем видеть исходное значение
Start learning React Hooks
на пользовательском интерфейсе.
Обновление компонента с новыми данными.
Чтобы обновить компонент новыми данными, нам нужно сделать значение «реактивным».
Для этого необходимо выполнить следующие действия:
- Сохранить данные между рендерами
- Вызвать React для рендеринга компонента с новыми данными (повторный рендеринг).
Чтобы обновить компонент новыми данными, мы должны полагаться на хук useState
. Он обеспечит две вещи:
- Во-первых, переменную состояния для сохранения данных между рендерами.
- Во-вторых, функцию-сеттер для обновления переменной и запуска React для повторного рендеринга компонента.
Используя хук useState
, React может отслеживать изменения в значении, сравнивая новое значение с начальным.
Давайте теперь сделаем наше состояние реактивным с помощью хука useState()
.
Что такое хук useState?
Хук useState() позволяет вам добавлять
переменные состояния
в функциональные компоненты. Это позволяет разработчикам отслеживать изменения, обновлять и манипулировать состоянием внутри функциональных компонентов без необходимости преобразовывать их в компоненты класса.
Синтаксис для крючка useState
Синтаксис хука useState
выглядит следующим образом
const [state, setState] = useState(initialState)
Как использовать хук useState
Чтобы использовать хук useState()
, нам нужно импортировать его из библиотеки react
, как показано ниже
import React,{useState} from "react";
- Теперь, когда мы импортировали хук
useState()
, мы можем использовать его в нашем функциональном компоненте и передать ему реактивное значение. - Реактивное значение — это начальное значение или начальное состояние, которое вы хотите отобразить на пользовательском интерфейсе.
В коде ниже мы вызываем хук useState
и передаем ему наше начальное состояние
... = useState("Start learning React Hooks");
Ниже приведен полный код, давайте разберем его подробнее:
import React, { useState } from "react";
import "./styles.css";
export default function App() {
//calling the useState hook and passing the initial value
const [userMsg, setUserMsg] = useState("Start learning React Hooks");
//function to change the state
const handleUserMsg = () => {
//update the state inside this function's body
};
return (
<div className="App">
<h1>Hello User</h1>
<h2>{userMsg}</h2>
<button onClick={handleUserMsg}>Get Started</button>
</div>
);
}
Под капотом хука useState
Когда хук useState()
вызывается следующим образом: useState("Start learning React Hooks")
, он возвращает массив с двумя значениями:
- Во-первых, это начальное значение состояния
- Далее, функция под названием
setter
, отвечающая за обновление текущего состояния.
Затем мы используем деструктуризацию массива
в JavaScript, чтобы сохранить значения, возвращенные вызовом функции useState()
в отдельные переменные: userMsg
и setUserMsg
.
const [userMsg, setUserMsg] = useState("Start learning React Hooks");
В приведенном выше коде:
- Начальное состояние хранится в переменной
userMsg
. - Функция-сеттер, отвечающая за обновление текущего состояния, будет храниться в переменной
setUserMsg
. - Имя переменной зависит только от вас. По соглашению, мы называем переменные состояния как
[someState, setSomeState]
.
Чтение переменной состояния
Начальное значение, хранящееся в переменной userMsg
, можно прочитать . Мы используем его в нашем JSX-шаблоне как {userMsg}
.
import React, { useState } from "react";
import "./styles.css";
export default function App() {
// defining a user message state
const [userMsg, setUserMsg] = useState("Start learning React Hooks");
//function to change the state
const handleUserMsg = () => {};
return (
<div className="App">
<h1>Hello User</h1>
{/* using the state */}
<h2>{userMsg}</h2>
<button onClick={handleUserMsg}>Get Started</button>
</div>
);
}
- Теперь везде, где мы используем состояние
{userMsg}
в нашем шаблоне, мы будем ожидать вывода начального значенияStart learning React Hooks
.
Обновление состояния с помощью функции Setter
Функция setter, возвращаемая хуком
useState
, отвечает за обновление состояния в компоненте react.
- Каждый раз, когда мы хотим обновить состояние в React, мы должны использовать функцию
setter
, а не обновлять состояние напрямую. - То есть, мы не можем присвоить новое значение переменной в React и ожидать, что новое значение отразится в пользовательском интерфейсе. Нам нужно будет использовать функцию
setter
для присвоения нового значения.
Ссылаясь на код выше, когда мы нажмем на кнопку Get Started
, будет выполнена функция обработчика события handleUserMsg
.
В блоке кода функции handleUserMsg
мы обновим состояние, выполнив следующие действия:
- Мы вызовем функцию
setUserMsg
, а затем передадим ей новое значение, которое мы хотим сохранить вuserMsg
.
Смотрите код ниже:
const handleUserMsg = () => {
//updating the state variable
setUserMsg("Lesson one: React useState Hook");
};
- Функция
setUserMsg
теперь обновила значение, хранящееся вuserMsg
.
Теперь, когда мы нажмем кнопку Get Started
, будет выполнена функция handleUserMsg
, и в теле функции мы обновим значение, хранящееся в userMsg
. Поскольку переменной userMsg
было присвоено новое значение, компонент будет перерендерирован, и браузер отобразит новое значение Урок первый: React useState Hook
.
Пользовательский интерфейс отобразит следующее:
Hello User
Lesson one: React useState Hook
Ниже приведен обновленный код:
import React, { useState } from "react";
import "./styles.css";
export default function App() {
// defining a user message state
const [userMsg, setUserMsg] = useState("Start learning React Hooks");
//function to update the state
const handleUserMsg = () => {
//updating the state variable
setUserMsg("Lesson one: React useState Hook");
};
return (
<div className="App">
<h1>Hello User</h1>
{/* using the state */}
<h2>{userMsg}</h2>
<button onClick={handleUserMsg}>Get Started</button>
</div>
);
}
Теперь, используя хук useState
, мы можем добиться следующего:
- Решить, какие данные или информацию отображать на пользовательском интерфейсе
- Обновить эти данные или информацию с помощью функции
setter
, предоставляемой хукомuseState()
.
Добавление нескольких переменных состояния в компонент
Более одного состояния (данных или информации) стольких типов данных
можно добавить в наш компонент с помощью нескольких вызовов useState()
. Это поможет нам отобразить важную информацию на пользовательском интерфейсе нашего приложения.
Чтобы добиться этого, используйте приведенный ниже синтаксис:
function MyComponent() {
const [state1, setState1] = useState(initial1); // first state
const [state2, setState2] = useState(initial2); // second state
const [state3, setState3] = useState(initial3); // third state
// ...
}
Давайте отобразим несколько данных или информации (состояние) в нашем приложении.
import React, { useState } from "react";
import "./styles.css";
export default function App() {
// adding multiple states
const [userName, setUserName] = useState("Emmanuel");
const [posts, setPosts] = useState(7);
const [showPosts, setShowPosts] = useState(false);
return (
<div className="App">
{/* using the userName state */}
<h1>Hello {userName}</h1>
{/* using the posts state */}
<p>You have {posts} articles published </p>
</div>
);
}
Вывод кода будет выглядеть следующим образом
Hello Emmanuel
You have 7 articles published
- В приведенном выше коде мы отображаем информацию о пользователе, а также количество опубликованных постов.
- Например, переменные состояния
userName
иposts
не связаны между собой, поэтому мы создаем несколько переменных состояния. - Если переменные состояния связаны между собой, будет хорошей идеей поместить их в
object
.
Использование объектов в качестве переменных состояния
Переменная состояния может быть любого типа data
. До сих пор мы использовали строку
и число
в качестве переменных состояния.
Давайте рассмотрим использование object
в качестве переменных состояния.
import React, { useState } from "react";
import "./styles.css";
export default function App() {
//using objects as state variables.
const [userDetails, setUserDetails] = useState({
fullName: "Emmanuel Kumah",
title: "Frontend Developer",
location: "Ghana",
bio: "Helping you understand everyline of code"
});
return (
<div className="App">
<h1>Profile </h1>
<p>
<strong>Name:</strong>
{userDetails.fullName}
</p>
<p>
<strong>Title:</strong>
{userDetails.title}
</p>
<p>
<strong>location</strong>
{userDetails.location}
</p>
<p>
<strong>Bio</strong>:{userDetails.bio}
</p>
</div>
);
}
- В
userDetails
хранитсяobject
{...}
. - В нашем шаблоне JSX мы можем получить доступ к объекту
values
, используя соответствующийkey
Например,{userDetails.fullName}
.
В результате вы получите следующее:
Profile
Name:Emmanuel Kumah
Title:Frontend Developer
location: Ghana
Bio:Helping you understand everyline of code
- Все наши данные хранились в
объекте
под названиемuserDetails
. - Мы получили доступ к данным, хранящимся в объекте
userDetails
, используя паруkey:value
в JavaScript. - После этого наш пользовательский интерфейс отобразит необходимые данные.
- Если мы захотим обновить данные, мы воспользуемся функцией
setUserDetails
и обновим соответствующее значение.
Обновление состояния на основе предыдущего состояния
Часто мы хотим обновить состояние, опираясь на значение предыдущего состояния.
Например:
- У нас есть переменная состояния
count
, инициализированная в0
. - Когда мы нажимаем на кнопку
Count me
, мы хотим подсчитать, сколько раз была нажата эта кнопка. - Для этого нам нужен доступ к предыдущему счету, чтобы увеличить его на единицу.
Рассмотрим пример
import React, { useState } from "react";
import "./styles.css";
export default function App() {
const [count, setCount] = useState(0);
// function to increase count
const handleCount = () => {
//updating the state based on previous value
setCount((count) => count + 1);
};
return (
<div className="App">
{/* using the count state */}
<p>You have clicked the button {count} times</p>
<button onClick={handleCount}>Count me</button>
</div>
</div>
);
}
Что происходит в приведенном выше коде:
- Был вызван хук
useState()
, который передал начальное значение0
. - Два значения, возвращенные вызовом
useState(0)
, хранятся в переменныхcount
иsetCount
. - Значение начального состояния
0
хранится в переменнойcount
. - Функция
setCount
, которая являетсяsetter
, обновит значениеcount
. - В нашем шаблоне JSX мы отображаем значение
count
как{count}
. - При повторном рендеринге компонента мы увидим на экране значение
0
.
- Чтобы обновить значение
count
на основе предыдущего значения, нам нужно передать функцию обновления вsetCount
. - Функция
updater
принимаетпредыдущее состояние
и оцениваетследующее состояние
.
Ниже приведена функция для обновления состояния
// function to increase count
const handleCount = () => {
setCount((count) => count + 1);
};
- Обратите внимание на
setCount((count) => count + 1)
. (count) => count + 1
— это функцияupdater
. Это функцияcallback
, которую мы передали функцииsetter
.- Когда функция
setCount
будет выполнена, она оценит выражение, переданное в качестве аргументов. - В выражении мы обращаемся к текущему
count
, увеличиваем его значение на1
и возвращаем значение - Таким образом, если текущее состояние
count
имеет значение0
, при первом нажатии кнопки значение обновляется до1
.
Если вы хотите обновить состояние на основе значения в предыдущем состоянии, не забудьте передать функцию
updater
в функциюsetter
.
- Нажав на кнопку
count me
, мы вызываем функциюhandleCount
. - В
setCount
ставит в очередь функциюcallback
илиupdater
. - Во время следующего рендера будет вызвана функция
updater
, которая возьмет предыдущее значениеcount
, добавит к нему1
,count + 1
, и вернет **обновленное **значение. - При следующем нажатии на кнопку значение
current state
теперь1
, и мы добавляем1
к текущему состоянию, возвращая следующее значение2
.
Вот что происходит, когда мы нажимаем на кнопку count me
3 раза.
// function to increase count
const handleCount = () => {
setCount((count) => count + 1); // setCount(0 => 1);
setCount((count) => count + 1); // setCount(1 => 2);
setCount((count) => count + 1); // setCount(2 => 3);
};
Где вызывать хук useState()
Помните о следующих правилах при использовании хука useState()
:
- Не используйте
useState()
в циклах, условиях, вложенных функциях и т.д. - Используйте только
useState()
внутри функционального компонента или пользовательского хука - Вызывайте хук
useState()
на верхнем уровне компонента.
Подведение итогов
В заключение:
- В приложении React плохой практикой является обновление переменных состояния напрямую, как мы это делаем в JavaScript.
- Мы должны использовать хук
useState
для отслеживания, обновления и управления состояниями в функциональных компонентах - Переменная
state
может быть любоготипа данных
(строки
,числа
,булевы
,объекты
). - Вызов хука
useState(initialState)
возвращает два значения,initalState
и функциюsetter
. - Для обновления состояния используйте функцию
setter
. - Когда состояние обновляется, компонент перерисовывается, чтобы показать обновленное состояние (данные) в нашем пользовательском интерфейсе.
- Вы можете иметь несколько переменных состояния в вашем компоненте.
Спасибо, что нашли время прочитать мою статью. Если вы нашли эту статью полезной, поделитесь ею на своих страницах в социальных сетях. Любые комментарии или предложения по статье будут вам признательны.
Написано с любовью из Ганы. Me daa se (Спасибо)