Введение
Добро пожаловать в документацию по React! В этом практическом занятии вы познакомитесь с использованием хуков.
This tutorial is from open-source community. Access the source code
💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал
Добро пожаловать в документацию по React! В этом практическом занятии вы познакомитесь с использованием хуков.
Виртуальная машина уже содержит проект React. В общем случае, вам нужно только добавить код в
App.js
.
Для установки зависимостей используйте следующую команду:
npm i
Функции, имена которых начинаются с use
, называются хуками. useState
- это встроенный хуок, предоставляемый React. Другие встроенные хуки можно найти в справочнике API. Также вы можете написать свои собственные хуки, комбинируя существующие.
Хуки более ограничены, чем другие функции. Вы можете вызывать хуки только в начале компонентов (или других хуков). Если вы хотите использовать useState
в условиях или циклах, извлеките новый компонент и поместите его там.
В предыдущем примере у каждого MyButton
был свой независимый count
, и при нажатии на каждую кнопку изменялось только count
для нажатой кнопки:
Однако часто вам нужно, чтобы компоненты могли делиться данными и всегда обновляться вместе.
Чтобы оба компонента MyButton
отображали одинаковое значение count
и обновлялись вместе, вам нужно перенести состояние из отдельных кнопок "вверх" в ближайший компонент, содержащий все они.
В этом примере это MyApp
:
Теперь при нажатии на любую кнопку count
в MyApp
изменится, что приведет к изменению обоих значений count
в MyButton
. Вот, как это можно выразить в коде.
Во - первых, перенесите состояние из MyButton
в MyApp
:
// App.js
export default function MyApp() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<div>
<h1>Counters that update separately</h1>
<MyButton />
<MyButton />
</div>
);
}
function MyButton() {
//... мы переносим код отсюда...
}
Затем передайте состояние из MyApp
в каждый MyButton
, вместе с общим обработчиком клика. Вы можете передавать информацию в MyButton
с использованием фигурных скобок в JSX, так же, как вы это делали ранее с встроенными тегами, такими как <img>
:
export default function MyApp() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<div>
<h1>Counters that update together</h1>
<MyButton count={count} onClick={handleClick} />
<MyButton count={count} onClick={handleClick} />
</div>
);
}
Информация, которую вы передаете так, называется пропсами. Теперь компонент MyApp
содержит состояние count
и обработчик события handleClick
и передает оба эти значения в качестве пропсов в каждую кнопку.
Наконец, измените MyButton
, чтобы он читал пропсы, переданные из родительского компонента:
function MyButton({ count, onClick }) {
return <button onClick={onClick}>Clicked {count} times</button>;
}
При нажатии на кнопку срабатывает обработчик onClick
. Каждая кнопка имеет пропс onClick
, установленный на функцию handleClick
внутри MyApp
, поэтому код внутри нее выполняется. Этот код вызывает setCount(count + 1)
, увеличивая переменную состояния count
. Новое значение count
передается в качестве пропса в каждую кнопку, поэтому все они показывают новое значение. Это называется "поднятием состояния вверх". Перемещая состояние вверх, вы поделили его между компонентами.
import { useState } from "react";
export default function MyApp() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<div>
<h1>Counters that update together</h1>
<MyButton count={count} onClick={handleClick} />
<MyButton count={count} onClick={handleClick} />
</div>
);
}
function MyButton({ count, onClick }) {
return <button onClick={onClick}>Clicked {count} times</button>;
}
Для запуска проекта используйте следующую команду. Затем вы можете обновить вкладку Web 8080, чтобы просмотреть веб - страницу.
npm start
Поздравляем! Вы завершили практическое занятие по использованию хуков. Вы можете выполнить больше практических заданий в LabEx, чтобы улучшить свои навыки.