Почему срабатывает не всегда определение низа страницы?

Не могу понять в чем дело, наблюдаю странный эффект. Мне нужно подгружать контент, когда пользователь приближается к низу страницы.
У меня есть состояние, которое запрещает либо разрешает подгружать контент, и активируется оно в тот момент когда до низа остается меньше определенного числа. Вот состояние:

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 шт):

Автор решения: webphp

Решил свою проблему, как я понял или просто совпадение, думаю что все дело было в массовых операциях в

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) ) {....

После этого никаких залипаний скролла не обнаружено =)

→ Ссылка