react使用window.onscroll不起作用的问题

Posted 幸福是奋斗出来的

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了react使用window.onscroll不起作用的问题相关的知识,希望对你有一定的参考价值。

做滚动加载的过程中发现,window.onsrcoll在react函数式组件中,不起作用,写在生命周期里也还是不行,几经周折,终于搞定

   1.
   useEffect(()=> {
        // 1.绑定滚动元素并添加scroll事件,组件销毁时移除
        const scrollDom = document.getElementById(\'wrapper\') 
        scrollDom.addEventListener(\'scroll\', handleScroll)
        return () => scrollDom.removeEventListener(\'scroll\', handleScroll); 
    }, [handleScroll])
   2.
    const handleScroll = useCallback(event => {
        const height = scrollEvent(event)
        if (hasMore && height <= 60) {
            const t =pageIndex+1;
            setPageIndex(t);
            setHasMore(false); // 需要改变状态不然会瞬间加载完所有
        }
    }, [hasMore,pageIndex])
   3. 计算距离底部的距离
      const scrollEvent = event => {
        if (!event.srcElement.scrollTop) {
           // 处理向上使劲滚动的时候scrollTop为undefined
           return undefined
         }
         // 滚动的高度
         const scrollTop =
           (event.srcElement ? event.srcElement.scrollTop : false) ||
           window.pageYOffset ||
           (event.srcElement ? event.srcElement.body.scrollTop : 0)
         // 视窗高度
         const clientHeight = (event.srcElement && event.srcElement.clientHeight) || document.body.clientHeight
         // 页面高度
         const scrollHeight = (event.srcElement && event.srcElement.scrollHeight) || document.body.scrollHeight
         // 距离页面底部的高度
         const height = scrollHeight - scrollTop - clientHeight
       
         return height
    }
    4.监听页数变化请求数据
     useEffect(() => {
        getData();
    }, [pageIndex]);
    5.
    axios().then(res=> {
          if(!res||res.length === 0){
                 setHasMore(false);
                 return;
          }
          const newList = dataArr.concat(res);
          setDataArr(newList);
          setHasMore(true);
    });
   

记得要给绑定的滚动元素添加高度和overflow:atuo呀!
如果有问题,感谢指正

以上是关于react使用window.onscroll不起作用的问题的主要内容,如果未能解决你的问题,请参考以下文章

优化移动端window.onscroll的执行频率方案

js的window.onscroll事件兼容各大浏览器

适用于iPhone / iPad的javascript滚动活动?

使用dwr后,javaweb设置的session超时失效,web.xml和tomcat设置都不起作

onscroll 元素滚动事件

类似吸顶功能解决io不能实时监听onscroll的触发问题