Не удается удалить прослушиватель прокрутки

#reactjs

#reactjs

Вопрос:

LandingPage.js

Я добавил прослушиватель событий прокрутки при монтировании

 componentDidMount() {
    window.addEventListener('scroll', this.scrollNavigation, true);
}
  

Я удаляю его перед размонтированием

 componentWillUnmount() {
    window.removeEventListener('scroll', this.scrollNavigation);
    console.log("unmountedLandingPage")
  }
  

Функция

 scrollNavigation = () => {
        console.log("called")
        const doc = document.documentElement;
        const top = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);
        if (top > 80) {
          document.getElementById('topnav').classList.add('nav-sticky');
        } else {
          document.getElementById('topnav').classList.remove('nav-sticky');
        }
      }
  

Проблема

Когда я перехожу на другую страницу, я вижу, что была напечатана ‘unmontedLandingPage’. Однако, когда я прокручиваю там, я все еще вижу, что «вызывается» печатается. Почему мой removeEventListener не работал?

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

1. Вам также необходимо перейти true removeEventListener к.

Ответ №1:

Если прослушиватель зарегистрирован дважды, один с захватом, а другой без, удалите каждый из них отдельно. Удаление перехватывающего прослушивателя не влияет на версию того же прослушивателя, и наоборот.

Источник — https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener

Итак, в вашем случае вы регистрируете прослушивающего прослушивателя, но пытаетесь удалить не захватывающего. Это не сработает.

Ответ №2:

Вы должны перейти true к вызову removeEventListener:

 componentWillUnmount() {
    window.removeEventListener('scroll', this.scrollNavigation, true);
    console.log("unmountedLandingPage")
  }
  

Из документов:

В то время как addEventListener() позволит вам добавлять один и тот же прослушиватель более одного раза для одного и того же типа, если параметры разные, единственным параметром removeEventListener() проверяет флаг захвата / использования. Его значение должно совпадать для соответствия removeEventListener(), но другие значения этого не делают.