> Какой React хук используется для хранения предыдущего значения (React)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: ITQ Group МКБ БАНК, EvApps
Стек: React
> Пример ответа
Короткий ответ
В React нет встроенного хука для хранения предыдущего значения. Разработчики обычно создают кастомный хук usePrevious, используя useRef и useEffect. useRef хранит значение между рендерами, а useEffect обновляет его после каждого рендера. Альтернативно можно использовать useRef напрямую с ручным обновлением в useEffect.
Подробное объяснение
useRef - это ключевой механизм для хранения предыдущего значения, так как он не вызывает ререндер при изменении своего .current свойства. Типичная реализация usePrevious выглядит так: внутри хука создаётся ref, который инициализируется переданным значением. В useEffect (без зависимостей, выполняется после каждого рендера) ref обновляется текущим значением. Возвращается же старое значение ref, сохранённое до вызова useEffect. Это работает благодаря порядку выполнения: сначала рендер (где возвращается предыдущее значение), затем эффект (где ref обновляется для следующего рендера).
Важно понимать, что это не "магическое" отслеживание изменений, а просто сохранение значения между рендерами. Если нужно отслеживать изменения конкретного пропса или состояния, можно использовать useRef в паре с useEffect с зависимостью от этого значения.
На практике
Этот паттерн полезен для сравнения текущего и предыдущего значения в эффектах, анимациях, логировании изменений или реализации undo/redo. Например, при работе с формами можно отслеживать, изменилось ли поле с предыдущего рендера. В компонентах с анимациями предыдущее значение используется для вычисления направления или типа перехода.
Пример кода
TYPESCRIPTimport { useRef, useEffect } from 'react';function usePrevious<T>(value: T): T | undefined {const ref = useRef<T>();useEffect(() => {ref.current = value;});return ref.current;}// Использованиеfunction Counter() {const [count, setCount] = useState(0);const prevCount = usePrevious(count);return (<div><p>Сейчас: {count}, было: {prevCount}</p><button onClick={() => setCount(c => c + 1)}>+1</button></div>);}
Как отвечать на собеседовании
Начни с того, что встроенного хука нет, но есть устоявшийся паттерн. Объясни механизм работы: useRef для хранения, useEffect для обновления после рендера. Упомяни, что хук возвращает undefined при первом рендере - это важно для обработки начального состояния. Если спросят про альтернативы, скажи, что можно использовать useRef напрямую с ручным присваиванием в useEffect, но кастомный хук чище и переиспользуемее.
Что проверяет интервьюер
Интервьюер проверяет понимание жизненного цикла React-компонента, разницу между useRef и useState, порядок выполнения рендера и эффектов. Также оценивается способность создавать абстракции (кастомные хуки) и знание типовых паттернов. Это базовый, но важный вопрос для senior - он показывает, насколько глубоко кандидат понимает механику React.
Типичные ошибки
- Использование
useStateвместоuseRef- это вызовет бесконечный ререндер. - Обновление ref до рендера - тогда предыдущее значение будет равно текущему.
- Забывание обработать случай первого рендера (возврат
undefined). - Попытка использовать
usePreviousвнутри эффекта с зависимостью от того же значения - это нарушает порядок обновления.
> Похожие задачи по frontend
Для чего служит второй аргумент у useEffect в React
Почему Error Boundary реализуется на классовом компоненте в React и какого метода жизненного цикла нет в функциональном компоненте?
В чем смысл React Query и зачем он нужен, если можно делать fetch напрямую
Какие варианты реализации debounce существуют в React для ограничения частоты вызова функции
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью