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

В компоненте реакции на основе классов вы можете просто сделать;

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

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

В моем приложении я выполняю функцию ниже при нажатии кнопки в компоненте 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});

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
9
0
6 329
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Divyanshu Rawat 15.12.2019 17:33

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