Очистить тайм-аут, установленный в событии клика в React

Мне интересно, как очистить тайм-аут, который устанавливается в событии onclick в React. Я знаю, что вы можете легко отменить тайм-ауты, когда они установлены в «useEffect», но как насчет этого варианта использования?

export default function SomeComponent() {
    const onClick = () => {
        setTimeout(() => {
            // dome some logic like API calls,
            // which should be terminated, in case the component
            // is unmounted
        }, 2_500)
    }

  return (
    <div><button onClick = {onClick}>Click me!</button></div>
  )
}

На ваш вопрос уже ответили здесь stackoverflow.com/questions/71499969/…, пожалуйста, ознакомьтесь с ним.

Namwanza Ronald 24.11.2022 08:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
119
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ну, вы можете сохранить тайм-аут в состоянии, а затем очистить его в useEffect следующим образом:

export default function SomeComponent() {
    const [timeoutInstance, setTimeoutInstance] = useState(null);
    const onClick = () => {
        const timeout = setTimeout(() => {
            // dome some logic like API calls,
            // which should be terminated, in case the component
            // is unmounted
        }, 2_500);
        setTimeoutInstance(timeout);
    }

    useEffect(() => {
      return () => {
        if (timeoutInstance) {
          clearTimeout(timeoutInstance);
          setTimeoutInstance(null);
        }
      }
    }, []);

    return (
      <div><button onClick = {onClick}>Click me!</button></div>
    )
}
Ответ принят как подходящий

Настройка тайм-аута аналогично этому примеру из MDM Web Docs, вероятно, является решением, которое вам нужно. В этом случае вы можете добавить useEffect для очистки при размонтировании компонента.


/* Code taken from MDN Docs */
const alarm = {
  remind(aMessage) {
    alert(aMessage);
    this.timeoutID = undefined;
  },

  setup() {
    if (typeof this.timeoutID === 'number') {
      this.cancel();
    }

    this.timeoutID = setTimeout((msg) => {
      this.remind(msg);
    }, 1000, 'Wake up!');
  },

  cancel() {
    clearTimeout(this.timeoutID);
  }
};

/* Clear timeout on component unmount */
useEffect(() => {
  return () => {
    alarm.cancel()
  }
}, [alarm])

Другие вопросы по теме