Files
frontend-docs/docs/react/05-base-hooks.md
2025-04-09 12:30:39 +03:00

150 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
sidebar_position: 5
---
# Базовые хуки React
React предоставляет несколько основных хуков, которые позволяют использовать состояние и другие возможности React в
функциональных компонентах. Вот основные хуки:
1. **useState:**
- Позволяет добавлять состояние в функциональный компонент.
- Возвращает массив, где первый элемент — текущее значение состояния, а второй — функция для его обновления.
```js
const [count, setCount] = useState(0);
```
2. **useEffect:**
- Позволяет выполнять побочные эффекты в функциональных компонентах (например, запросы к API, подписки, ручное
изменение DOM).
- Принимает два аргумента: функцию с эффектом и массив зависимостей (опционально).
```js
useEffect(() => {
document.title = `Вы нажали ${count} раз`;
}, [count]);
```
3. **useContext:**
- Позволяет использовать контекст в функциональных компонентах.
- Принимает объект контекста (созданный с помощью `React.createContext`) и возвращает текущее значение контекста.
```js
const value = useContext(MyContext);
```
4. **useReducer:**
- Альтернатива `useState` для управления сложным состоянием.
- Принимает редюсер (функцию, которая определяет, как состояние должно обновляться) и начальное состояние.
- Возвращает текущее состояние и функцию `dispatch` для отправки действий.
```js
const [state, dispatch] = useReducer(reducer, initialState);
```
5. **useCallback:**
- Возвращает мемоизированную версию колбэка, которая изменяется только при изменении зависимостей.
- Полезен для оптимизации производительности, когда колбэк передается в дочерние компоненты.
```js
const memoizedCallback = useCallback(() => {
doSomething(a, b);
}, [a, b]);
```
6. **useMemo:**
- Возвращает мемоизированное значение, которое пересчитывается только при изменении зависимостей.
- Полезен для оптимизации вычислений, которые требуют больших затрат ресурсов.
```js
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
```
7. **useRef:**
- Возвращает изменяемый объект, свойство `.current` которого инициализируется переданным аргументом.
- Используется для хранения мутабельных значений, которые не вызывают ререндер при изменении.
- Также может использоваться для получения ссылок на DOM-элементы.
```js
const inputRef = useRef(null);
```
8. **useImperativeHandle:**
- Позволяет настроить экземпляр значения, которое будет доступно при использовании `ref`.
- Обычно используется вместе с `forwardRef`.
```js
useImperativeHandle(ref, () => ({
focus() {
inputRef.current.focus();
}
}));
```
9. **useLayoutEffect:**
- Похож на `useEffect`, но выполняется синхронно после всех изменений DOM, но до того, как браузер отрисует
изменения.
- Используется для измерений DOM или других операций, которые должны быть выполнены до отрисовки.
```js
useLayoutEffect(() => {
// Логика, которая должна выполниться до отрисовки
}, [dependencies]);
```
10. **useDebugValue:**
- Используется для отладки пользовательских хуков.
- Позволяет отображать метку для пользовательских хуков в инструментах разработчика React.
```js
useDebugValue(isOnline ? 'Online' : 'Offline');
```
11. **useTransition:** позволяет вам обновлять состояние без блокировки пользовательского интерфейса. Он особенно полезен для оптимизации
производительности при медленных рендерах или когда вам нужно отложить менее важные обновления.
```jsx
import {useTransition} from 'react';
function MyComponent() {
const [isPending, startTransition] = useTransition();
// ...
}
```
- `startTransition` - функция, которая позволяет пометить обновления состояния как переходные (неблокирующие)
- `isPending` - булево значение, указывающее, активен ли в данный момент переход
**Когда использовать**
- **Медленные рендеры:** Когда у вас есть сложные вычисления или тяжелые компоненты, которые могут заблокировать UI
- **Отложенные обновления:** Когда некоторые обновления состояния могут быть отложены в пользу более важных
- **Улучшение воспринимаемой производительности:** Чтобы пользователь видел немедленный отклик на свои действия
**Особенности**
- **Приоритизация обновлений:** Обновления внутри startTransition имеют более низкий приоритет
- **Индикация загрузки:** isPending позволяет показать пользователю, что происходит фоновая загрузка
- **Совместимость с Suspense:** Хорошо работает вместе с Suspense для плавных переходов между состояниями
**Отличие от других подходов**
- **useDeferredValue:** Вместо управления обновлениями, откладывает значение
- **setTimeout:** useTransition интегрирован в планировщик React и работает более предсказуемо
12. **useDeferredValue** позволяет отложить обновление части UI, чтобы избежать блокировки основного потока при выполнении ресурсоемких операций. Он похож на `debounce` или `throttle`, но интегрирован в механизм рендеринга React.
**Когда использовать**
- Оптимизация производительности при работе с медленными или тяжелыми компонентами
- Отложенный рендеринг не критичных частей интерфейса
- Синхронизация нескольких состояний, когда одно зависит от другого, но может обновляться с задержкой
```jsx
import { useDeferredValue } from 'react';
function MyComponent({ value }) {
const deferredValue = useDeferredValue(value);
// ...
}
```
🚀 **_Источник: DeepSeek_** \
🚀 **Источник: [YT: useTransition и useDeferredValue хуки в React](https://www.youtube.com/watch?v=hWUlv7M7rR8)**