Таймаут‑переключатель состояния при изменении входных данных

Создайте таймер в useEffect с зависимостью data и очистите его при следующем изменении либо размонтировании. Состояние переключайте функциональным updater, чтобы не захватить старое значение.

Короткий ответ

Что ответить на собеседовании

Создайте таймер в useEffect с зависимостью data и очистите его при следующем изменении либо размонтировании. Состояние переключайте функциональным updater, чтобы не захватить старое значение.

Подробный разбор

Ответ с пояснениями

Условие

Компонент получает пропс data, который может обновляться. При каждом изменении data нужно запустить задержку в 3 секунды, после которой состояние focusState меняется на противоположное.

const App = ({ data }) => {
    const [focusState, setFocusState] = useState(false);
    return null;
}

Ответ

Создайте таймер в useEffect с зависимостью data и очистите его при следующем изменении либо размонтировании. Состояние переключайте функциональным updater, чтобы не захватить старое значение.

useEffect(() => {
  const timer = setTimeout(() => setFocusState(previous => !previous), 3000);
  return () => clearTimeout(timer);
}, [data]);

В этом варианте быстрые изменения data перезапускают ожидание: переключение произойдёт через три секунды после последнего. Эффект срабатывает также при первом монтировании. Для объекта сравнивается ссылка по Object.is, а не глубокое содержимое. Если требуется отдельное переключение для каждого изменения, нельзя отменять все предыдущие таймеры — это другой контракт.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее