Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: useEffect, setTimeout, clearTimeout, cleanup function, React hooks

Как корректно отменить setTimeout внутри хука при размонтировании компонента или сбросе состояния?

Проверяет понимание очистки таймеров в React при работе с хуками и жизненным циклом компонента.

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

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

Длинный ответ

Проблема с setTimeout в React

При использовании setTimeout внутри React-компонента возникает риск, что колбэк выполнится после того, как компонент уже размонтирован. Это может привести к утечкам памяти, ошибкам обновления состояния на размонтированном компоненте или неожиданному поведению.

Решение с помощью useEffect и cleanup функции

React предоставляет механизм очистки через возврат функции из useEffect. Эта функция вызывается при размонтировании компонента или перед повторным выполнением эффекта. Используйте её для вызова clearTimeout.

import { useEffect, useState } from 'react';

function TimerComponent() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    const timerId = setTimeout(() => {
      setCount(prev => prev + 1);
    }, 1000);

    // Функция очистки
    return () => {
      clearTimeout(timerId);
    };
  }, []); // Пустой массив зависимостей — выполняется один раз

  return Count: {count};
}

Обработка зависимостей и сброса состояния

Если таймер должен перезапускаться при изменении определённых значений, укажите их в массиве зависимостей. При каждом изменении зависимости эффект перезапускается: сначала вызывается cleanup (отменяет старый таймер), затем создаётся новый.

useEffect(() => {
  const timerId = setTimeout(() => {
    // действие
  }, delay);

  return () => clearTimeout(timerId);
}, [delay]); // перезапуск при изменении delay

Вывод

Всегда используйте cleanup функцию в useEffect для отмены setTimeout. Это обязательная практика для предотвращения утечек памяти и ошибок в React-приложениях, особенно при работе с асинхронными операциями и таймерами.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    4

Навыки

  • JavaScript

    JavaScript

  • React

    React

Ключевые слова

#useEffect

#setTimeout

#clearTimeout

#cleanup function

#React hooks

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию