| title | Built-in React Hooks |
|---|
Хуки позволяют использовать различные возможности React в ваших компонентах. Вы можете использовать встроенные хуки или комбинировать их для создания собственных. На этой странице перечислены все встроенные хуки React.
Состояние позволяет компоненту "запоминать" информацию, такую как ввод пользователя. Например, компонент формы может использовать состояние для хранения введенного значения, а компонент галереи изображений — для хранения индекса выбранного изображения.
Чтобы добавить состояние в компонент, используйте один из этих хуков:
useStateобъявляет переменную состояния, которую вы можете обновлять напрямую.useReducerобъявляет переменную состояния с логикой обновления внутри функции-редьюсера.
function ImageGallery() {
const [index, setIndex] = useState(0);
// ...Контекст позволяет компоненту получать информацию от удаленных родительских компонентов, не передавая ее через пропсы. Например, компонент верхнего уровня вашего приложения может передавать текущую тему интерфейса всем компонентам ниже, независимо от их глубины.
useContextсчитывает контекст и подписывается на него.
function Button() {
const theme = useContext(ThemeContext);
// ...Рефы позволяют компоненту хранить некоторую информацию, которая не используется для рендеринга, например, DOM-узел или идентификатор таймера. В отличие от состояния, обновление рефа не вызывает повторный рендеринг компонента. Рефы являются "лазейкой" из парадигмы React. Они полезны, когда вам нужно работать с внешними системами, такими как встроенные API браузера.
useRefобъявляет реф. Вы можете хранить в нем любое значение, но чаще всего он используется для хранения DOM-узла.useImperativeHandleпозволяет настроить реф, предоставляемый вашим компонентом. Это используется редко.
function Form() {
const inputRef = useRef(null);
// ...Эффекты позволяют компоненту подключаться к внешним системам и синхронизироваться с ними. Это включает работу с сетью, DOM браузера, анимациями, виджетами, написанными с использованием другой библиотеки пользовательского интерфейса, и другим кодом, не относящимся к React.
useEffectподключает компонент к внешней системе.
function ChatRoom({ roomId }) {
useEffect(() => {
const connection = createConnection(roomId);
connection.connect();
return () => connection.disconnect();
}, [roomId]);
// ...Эффекты являются "лазейкой" из парадигмы React. Не используйте эффекты для управления потоком данных вашего приложения. Если вы не взаимодействуете с внешней системой, вам может не понадобиться эффект.
Существуют две редко используемые вариации useEffect с различиями во времени выполнения:
useLayoutEffectсрабатывает до того, как браузер перерисует экран. Здесь вы можете измерять разметку.useInsertionEffectсрабатывает до того, как React внесет изменения в DOM. Библиотеки могут вставлять динамические CSS здесь.
Распространенный способ оптимизации производительности повторного рендеринга — пропуск ненужных вычислений. Например, вы можете указать React повторно использовать кэшированный результат вычислений или пропустить повторный рендеринг, если данные не изменились с момента предыдущего рендеринга.
Чтобы пропустить вычисления и ненужный повторный рендеринг, используйте один из этих хуков:
useMemoпозволяет кэшировать результат дорогостоящего вычисления.useCallbackпозволяет кэшировать определение функции перед передачей ее оптимизированному компоненту.
function TodoList({ todos, tab, theme }) {
const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]);
// ...
}Иногда вы не можете пропустить повторный рендеринг, потому что экран действительно нуждается в обновлении. В этом случае вы можете повысить производительность, разделяя блокирующие обновления, которые должны быть синхронными (например, ввод в поле), и неблокирующие обновления, которые не должны блокировать пользовательский интерфейс (например, обновление диаграммы).
Чтобы приоритизировать рендеринг, используйте один из этих хуков:
useTransitionпозволяет пометить переход состояния как неблокирующий и разрешить другим обновлениям прерывать его.useDeferredValueпозволяет отложить обновление некритической части пользовательского интерфейса и позволить другим частям обновиться первыми.
Эти хуки в основном полезны авторам библиотек и редко используются в коде приложений.
useDebugValueпозволяет настроить метку, которую React DevTools отображает для вашего пользовательского хука.useIdпозволяет компоненту связать с собой уникальный идентификатор. Обычно используется с API доступности.useSyncExternalStoreпозволяет компоненту подписываться на внешний источник данных.
useActionStateпозволяет управлять состоянием действий.
Вы также можете определить свои собственные пользовательские хуки в виде функций JavaScript.