извините за запутанный код. Я действительно запуталась здесь.
У меня есть Nav
компонент, который я хочу скрыть, когда пользователь прокручивает. Прокрутка обнаруживается с помощью прослушивателя событий (который сейчас находится в useEffect
, я действительно не знаю почему), который вызывает scrollDetect()
.
scrollDetect
затем устанавливает переменную состояния scrollState
, которая подключается к CSS через стилизованные компоненты.
Все работает очень хорошо, за исключением того, что я хочу остановить прослушиватель событий, когда панель навигации открыта. Открытое состояние панели навигации хранится в isOpen[1]
, но оно просто не обновляется в правильном порядке. Когда панель навигации открыта, кнопки по-прежнему прячутся при прокрутке. Чтобы увидеть поведение, о котором я говорю, посетите erasebegin.net. Попробуйте нажать одну из кнопок меню и затем прокрутить окно.
Я внимательно изучил всевозможные руководства, сообщения и документацию, но я езжу по очень многим кругам и немного схожу с ума по этому поводу, пожалуйста, помогите.
export default function Nav() {
const [isOpen, setIsOpen] = useState(["", false]);
const [envOpen, setEnvOpen] = useState(false);
const [scrollState, setScrollState] = useState("show");
// HIDE NAVBUTTONS ON DOWN SCROLL, REVEAL ON UP SCROLL
var lastScrollTop = window.pageYOffset || window.scrollTop;
const scrollDetect = () => {
if (isOpen[1] === false) {
var st = window.pageYOffset || document.documentElement.scrollTop;
if (st < lastScrollTop) {
setScrollState("show");
} else if (st > lastScrollTop) {
setScrollState("hide");
}
lastScrollTop = st <= 0 ? 0 : st;
}
};
useEffect(() => {
console.log(isOpen[1]);
const listener = document.addEventListener("scroll", scrollDetect);
const cleanup = () => {
document.removeEventListener("scroll", listener);
return cleanup;
};
}, [isOpen[1]]);
const setOpen = ([title, state]) => {
let newState = !state;
setIsOpen([title, newState]);
};
const envelopeOpen = () => {
setEnvOpen(true);
};
const envelopeClose = () => {
setEnvOpen(false);
};
removeEventListener
определенно запускается, но ничего не происходит T_T прослушиватель событий остается на месте - person Chris Haupt   schedule 12.08.2020