Базовые хуки React
React предоставляет несколько основных хуков, которые позволяют использовать состояние и другие возможности React в функциональных компонентах. Вот основные хуки:
- useState:
- Позволяет добавлять состояние в функциональный компонент.
- Возвращает массив, где первый элемент — текущее значение состояния, а второй — функция для его обновления.
const [count, setCount] = useState(0);
- useEffect:
- Позволяет выполнять побочные эффекты в функциональных компонентах (например, запросы к API, подписки, ручное изменение DOM).
- Принимает два аргумента: функцию с эффектом и массив зависимостей (опционально).
useEffect(() => {
document.title = `Вы нажали ${count} раз`;
}, [count]);
- useContext:
- Позволяет использовать контекст в функциональных компонентах.
- Принимает объект контекста (созданный с помощью
React.createContext) и возвращает текущее значение контекста.
const value = useContext(MyContext);
- useReducer:
- Альтернатива
useStateдля управления сложным состоянием. - Принимает редюсер (функцию, которая определяет, как состояние должно обновляться) и начальное состояние.
- Возвращает текущее состояние и функцию
dispatchдля отправки действий.
- Альтернатива
const [state, dispatch] = useReducer(reducer, initialState);
- useCallback:
- Возвращает мемоизированную версию колбэка, которая изменяется только при изменении зависимостей.
- Полезен для оптимизации производительности, когда колбэк передается в дочерние компоненты.
const memoizedCallback = useCallback(() => {
doSomething(a, b);
}, [a, b]);
- useMemo:
- Возвращает мемоизированное значение, которое пересчитывается только при изменении зависимостей.
- Полезен для оптимизации вычислений, которые требуют больших затрат ресурсов.
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
- useRef:
- Возвращает изменяемый объект, свойство
.currentкоторого инициализируется переданным аргументом. - Используется для хранения мутабельных значений, которые не вызывают ререндер при изменении.
- Также может использоваться для получения ссылок на DOM-элементы.
- Возвращает изменяемый объект, свойство
const inputRef = useRef(null);
- useImperativeHandle:
- Позволяет настроить экземпляр значения, которое будет доступно при использовании
ref. - Обычно используется вместе с
forwardRef.
- Позволяет настроить экземпляр значения, которое будет доступно при использовании
useImperativeHandle(ref, () => ({
focus() {
inputRef.current.focus();
}
}));
- useLayoutEffect:
- Похож на
useEffect, но выполняется синхронно после всех изменений DOM, но до того, как браузер отрисует изменения. - Используется для измерений DOM или других операций, которые должны быть выполнены до отрисовки.
- Похож на
useLayoutEffect(() => {
// Логика, которая должна выполниться до отрисовки
}, [dependencies]);
- useDebugValue:
- Используется для отладки пользовательских хуков.
- Позволяет отображать метку для пользовательских хуков в инструментах разработчика React.
useDebugValue(isOnline ? 'Online' : 'Offline');
- useTransition: позволяет вам обновлять состояние без блокировки пользовательского интерфейса. Он особенно полезен для оптимизации производительности при медленных рендерах или когда вам нужно отложить менее важные обновления.
import {useTransition} from 'react';
function MyComponent() {
const [isPending, startTransition] = useTransition();
// ...
}
startTransition- функция, которая позволяет пометить обновления состояния как переходные (неблокирующие)isPending- булево значение, указывающее, активен ли в данный момент переход
Когда использовать
- Медленные рендеры: Когда у вас есть сложные вычисления или тяжелые компоненты, которые могут заблокировать UI
- Отложенные обновления: Когда некоторые обновления состояния могут быть отложены в пользу более важных
- Улучшение воспринимаемой производительности: Чтобы пользователь видел немедленный отклик на свои действия
Особенности
- Приоритизация обновлений: Обновления внутри startTransition имеют более низкий приоритет
- Индикация загрузки: isPending позволяет показать пользователю, что происходит фоновая загрузка
- Совместимость с Suspense: Хорошо работает вместе с Suspense для плавных переходов между состояниями Отличие от других подходов
- useDeferredValue: Вместо управления обновлениями, откладывает значение
- setTimeout: useTransition интегрирован в планировщик React и работает более предсказуемо
- useDeferredValue позволяет отложить обновление части UI, чтобы избежать блокировки основного потока при выполнении ресурсоемких операций. Он похож на
debounceилиthrottle, но интегрирован в механизм рендеринга React.
Когда использовать
- Оптимизация производительности при работе с медленными или тяжелыми компонентами
- Отложенный рендеринг не критичных частей интерфейса
- Синхронизация нескольких состояний, когда одно зависит от другого, но может обновляться с задержкой
import { useDeferredValue } from 'react';
function MyComponent({ value }) {
const deferredValue = useDeferredValue(value);
// ...
}
🚀 Источник: DeepSeek
🚀 Источник: YT: useTransition и useDeferredValue хуки в React