Причина, по которой это не работает, заключается в том, что setPageHeightWrapper
определена как встроенная функция, и когда компонент повторно отображает новый экземпляр, он создается, и при очистке прослушивателя событий необходимо передать тот же метод, который был переданпри настройке слушателя.
С другой стороны, когда вызывается ловушка useEffect, получает ссылку на функцию из своего замыкания и использует ту же ссылку для очистки слушателя.
A wayчтобы заставить removeListener работать за пределами useEffect - использовать useCallback
hook
const handleSearch = () => {
window.removeEventListener('resize', memoHeightWrapper);
};
const [pageHeight, setPageHeight] = useState(0);
const memoHeightWrapper = useCallback(() => {
setPageHeight(window.innerHeight);
})
useEffect(() =>{
window.addEventListener('resize', memoHeightWrapper);
return () => {
window.removeEventListener('resize', memoHeightWrapper);
};
}, []);