Почему срабатывает не всегда определение низа страницы?
Не могу понять в чем дело, наблюдаю странный эффект.
Мне нужно подгружать контент, когда пользователь приближается к низу страницы.
У меня есть состояние, которое запрещает либо разрешает подгружать контент, и активируется оно в тот момент когда до низа остается меньше определенного числа.
Вот состояние:
const [fetching, setFetching] = useState(true);
useEffect(() => {
if(fetching) {
// тут обновляю состояние которое добавляет новый контент
}
}, [fetching])
Есть так же состояние скролла
useEffect(() => {
document.addEventListener("scroll", scrollHandler)
return () => document.removeEventListener("scroll", scrollHandler)
}, [])
Ну и сам scrollHandler:
const scrollHandler = (e: any) => {
if(e.target.documentElement.scrollHeight - (e.target.documentElement.scrollTop + window.innerHeight) < 100 ) {
setFetching(true)
}
}
Дело в том что если устанавливать setFetching(true), когда до конца страницы осталось меньше 100px, все работает идеально, но при таком значении пользователь видит то как подгружается контент, а хочется скрыть этот момент и для этого нужно увеличить значение, к примеру, до 1000
const scrollHandler = (e: any) => {
if(e.target.documentElement.scrollHeight - (e.target.documentElement.scrollTop + window.innerHeight) < 1000 ) {
setFetching(true)
}
}
И тут начинается интересное, контент в любой момент может прекратить подгружаться, и не могу понять в чем дело, или это из за массовых операций addEventListener и removeEventListener, или ещё каких-то причин. Как решить проблему или реализовать по-иному?
Ответы (1 шт):
Решил свою проблему, как я понял или просто совпадение, думаю что все дело было в массовых операциях в
const scrollHandler = (e: any) => {....
У меня есть div блок который визуализирует подгрузку контента и он отображается лишь во время того как fetching = true, и скрывается когда он равен false. За счет этого и удалось решить проблему, а именно дополнить следующую проверку
if(document.querySelector(".js-loading.hidden") && (e.target.documentElement.scrollHeight - (e.target.documentElement.scrollTop + window.innerHeight) < 1000) ) {....
После этого никаких залипаний скролла не обнаружено =)