屏幕滚动事件没有触发

来源:8-6 加载更多功能实现

帅气的灯泡

2019-02-25

代码如下:

handleScroll = () => {
    const scrollTop =
      document.documentElement.scrollTop || document.body.scrollTop;
    const screenHeight = document.documentElement.clientHeight;
    const likeListTop = this.myRef.current.offsetTop;
    const likeListHeight = this.myRef.current.offsetHeight;

    if (scrollTop >= likeListHeight + likeListTop - screenHeight) {
      const newData = this.state.data.concat(dataSource);
      const newLoadTimes = this.state.loadTimes + 1;
      setTimeout(() => {
        this.setState(() => ({
          data: newData,
          loadTimes: newLoadTimes
        }));
      }, 1000);
    }
  };

我认为这行代码出了问题,

if (scrollTop >= likeListHeight + likeListTop - screenHeight)

因为改成

if (scrollTop >= 1)

理所当然,就执行了

用的是最新的谷歌浏览器

写回答

2回答

艾特老干部

2019-02-26

你好,我使用Chrome的最新版本72.0.3626.119进行验证,没有发现你的问题。这个判断条件是没有问题的,你可以先在浏览器的正常PC模式下(不使用手机模式)测试下滚动刷新是否生效,然后在切到手机模式测试,可以多换几个手机分辨率测试。你的问题有可能是因为在手机模式下,浏览器在某些情况下,对DOM高度计算错误导致滚动刷新条件未生效。

1
1
帅气的灯泡
非常感谢!
2019-02-26
共1条回复

幽幽三途河

2019-06-21

我今天也遇到你这个问题,我的解决方案是:把 ref 定位到 list 部分,而不是整个 LikeList 组件的开头(因为这样还包括了 header 部分,所以在计算的时候 scrolleTop 是不会大于等于计算之后的可滚动高度)。
//img.mukewang.com/szimg/5d0cf0650001de2109130407.jpg

3
0

React16+Redux实战企业级大众点评Web App

从架构设计到部署上线,带你学习React技术栈与核心思想

1071 学习 · 306 问题

查看课程