> Какие хуки существуют кроме useState и useEffect (React)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Консорциум кодекс
Стек: React
> Пример ответа
Короткий ответ
Помимо useState и useEffect, в React существует множество встроенных хуков: useContext для доступа к контексту, useReducer для сложной логики состояния, useCallback и useMemo для мемоизации, useRef для ссылок на DOM и изменяемых значений, useImperativeHandle для кастомного ref, useLayoutEffect для синхронных side-эффектов, useDebugValue для отладки кастомных хуков, а также useId для генерации уникальных идентификаторов в SSR.
Подробное объяснение
React предоставляет 15 встроенных хуков (начиная с версии 18), каждый из которых решает определённую задачу. Их можно разделить на группы:
Хуки состояния:
useState- базовый хук для локального состоянияuseReducer- альтернатива useState для сложной логики с редьюсером (как в Redux)useContext- доступ к контексту без прокидывания пропсов
Хуки эффектов:
useEffect- side-эффекты после рендераuseLayoutEffect- синхронный эффект до отрисовки браузером (для измерений DOM, анимаций)
Хуки мемоизации:
useMemo- мемоизация вычисляемого значенияuseCallback- мемоизация функции (по сути, useMemo для функций)
Хуки ссылок:
useRef- mutable ref для DOM-элементов и хранения значений без ререндераuseImperativeHandle- кастомизация ref, передаваемого через forwardRef
Хуки для работы с DOM:
useId- генерация уникальных ID (важно для SSR и accessibility)useDeferredValue- отложенное обновление части UI (React 18)useTransition- пометка обновления как низкоприоритетного (React 18)
Хуки для отладки:
useDebugValue- отображение метки для кастомных хуков в React DevTools
Хуки для синхронного рендера (React 18):
useSyncExternalStore- для внешних хранилищ (библиотеки стейт-менеджмента)
На практике
Для senior-разработчика важно понимать trade-off между хуками:
- useReducer vs useState: useReducer предпочтительнее, когда состояние зависит от предыдущего, или когда логика обновления сложная (много полей). Для простых флагов - useState.
- useMemo vs useCallback: useMemo для значений, useCallback для функций. Не мемоизируйте всё подряд - измеряйте производительность.
- useEffect vs useLayoutEffect: 99% случаев - useEffect. useLayoutEffect нужен только когда нужно измерить DOM до того, как пользователь увидит изменения (например, позиционирование тултипа).
- useRef vs useState: useRef не вызывает ререндер - используйте для значений, которые не влияют на UI (таймеры, предыдущие пропсы).
- useId vs ручной ID: всегда используйте useId для accessibility и гидратации - ручные ID ломают SSR.
Пример кода
JSX// Пример комбинации хуков для сложной формыfunction UserForm({ initialData }) {const [state, dispatch] = useReducer(formReducer, initialData);const formRef = useRef(null);const id = useId();const handleSubmit = useCallback((e) => {e.preventDefault();dispatch({ type: 'SUBMIT' });}, []);const isDirty = useMemo(() => {return JSON.stringify(state) !== JSON.stringify(initialData);}, [state, initialData]);useLayoutEffect(() => {if (formRef.current) {formRef.current.scrollIntoView({ behavior: 'smooth' });}}, [state.errors]);return (<form ref={formRef} onSubmit={handleSubmit} aria-labelledby={id}><h2 id={id}>User Form</h2><inputvalue={state.name}onChange={(e) => dispatch({ type: 'SET_NAME', payload: e.target.value })}/>{isDirty && <button type="submit">Save</button>}</form>);}
Как отвечать на собеседовании
Начните с перечисления всех хуков, затем сгруппируйте их по назначению. Покажите понимание не только синтаксиса, но и когда какой хук применять. Упомяните React 18 хуки (useTransition, useDeferredValue, useSyncExternalStore) - это показывает актуальность знаний. Приведите пример из реального проекта, где вы выбирали между хуками.
Что проверяет интервьюер
- Глубину знания React (не только useState/useEffect)
- Понимание trade-off между хуками
- Знание новых возможностей React 18
- Умение объяснять сложные концепции простым языком
- Практический опыт (не заученные определения)
Типичные ошибки
- Забывают про useLayoutEffect, useImperativeHandle, useDebugValue
- Путают useMemo и useCallback (первый для значений, второй для функций)
- Считают, что useRef только для DOM-ссылок (забывают про хранение значений)
- Не знают про useId и useSyncExternalStore
- Говорят "useEffect для всего" - это red flag для senior
- Не упоминают, что хуки - это замена lifecycle-методам классовых компонентов
> Похожие задачи по frontend
Как отреагировать и что делать при переходе команды с React на Vue
Можно ли использовать useEffect в кастомном хуке
Как обработать ответ API в React
Сколько значений возвращает хук useQuery
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью