Отписаться от перехватчиков реакции прослушивателя событий

#javascript #reactjs #react-router #event-listener #react-router-dom

#javascript #reactjs #реагировать-маршрутизатор #прослушиватель событий #реагировать-маршрутизатор-dom

Вопрос:

В компоненте react на основе классов вы могли бы просто сделать;

 componentWillUnmount() {
  window.removeEventListener('resize', this.resizeHandler);
}
  

Хотя я не уверен, как это сделать в компоненте на основе функций с перехватчиками реакции?

В моем приложении я выполняю описанную ниже функцию при нажатии кнопки в компоненте LoginCard .

 const handleLogin = (email, password) => {
  loginService.login(email, password)
    .then((response) => {
      if (!response.error) {
        props.history.push("/");
      }
    });
}
  

И я переношу экспорт из LoginCard в withRouter функцию из react-router-dom для перенаправления на адрес маршрута.

export default withRouter(LoginCard);

Внутри LoginCard компонента у меня есть Tabs компонент, в useEffect перехватчике которого находится прослушиватель событий.

 useEffect(() => {
      setUnderLineStyle(getUnderlineStyle());
      window.addEventListener("resize", _.throttle(() => { 
         setUnderLineStyle(getUnderlineStyle())}, 
         300), 
         {passive:true});
   }, [props]);
  

Однако, когда я нажимаю эту кнопку в LoginCard и перенаправляюсь на / , а затем изменяю размер окна, вызывается функция внутри списка событий изменения размера setUnderLineStyle(getUnderlineStyle()) .

Я пытался добавить следующее в, useEffect но setUnderLineStyle(getUnderlineStyle()) все еще вызывается при изменении размера.

 return () => window.removeEventListener("resize", _.throttle(() => { 
                setUnderLineStyle(getUnderlineStyle())}, 
                300), 
                {passive:true});
  

Есть идеи? Даже вокруг лучшего метода перенаправления, чтобы попасть на / via react-router-dom или как эффективно отписаться от прослушивателей событий?

Ответ №1:

Сделайте второй useEffect исключительно для использования размонтирования. Пустые зависимости в useEffect позволяют ему эффективно функционировать как a componentDidMount , а возврат этого эффективно функционирует как a componentWillUnmount .

 useEffect(() => {
    // Do mounting stuff here

    return () => {
        // Do unmounting stuff here
    };
}, []);
  

Комментарии:

1. Я думаю, что в вашем ответе отсутствует обратный вызов useEffect( () => {}, []);