react的下拉加载更多

业务背景

常常会有这样的业务场景。下拉加载更多。之前我手写过一个方案,但是后来发现github上已经有现成的库react-infinite-scroll-component了(之前手写的时候,关键词没有搜对,所以没有找到现成的库。哈哈哈哈)。于是看一下它的源码,对比一下我之前的实现。

我的方案

在了解下拉加载更多这个功能之前,需要搞清楚clientHeight, scrollTop以及scrollHeight 三个概念。
可以看这篇文章
下拉加载更多的方案就是,当满足如下公式时,去请求资源

 target.scrollTop + target.clientHeight = target.scrollHeight

具体方案就是:
在某个元素上绑定scroll监听事件,调用load函数。做得更精细点,当上一次load请求没有产生任何数据,那么下一次不再请求。

function handleScroll(event) {
let isToBottom = event.target.scrollTop +   event.target.clientHeight  -  event.target.scrollHeight === 0

 if (isToBottom && hasMore) {
         load()
   }
}
element.addEventListener('scroll', this.handleScroll)

源码解析

我看了一下react-infinite-scroll-component的源码,发现原理都是一样的。只不过别人处理得更精细一点

精细点1

在调用监听函数时,有一个固定时间的延迟,为了防止多次监听函数

this.throttledOnScrollListener = throttle(this.onScrollListener, 150).bind(
      this
);
 this.el.addEventListener("scroll", this.throttledOnScrollListener);

精细点2

在算何时触发调用load函数时,它的公式和我不一样,如下所示

let isToBottom = event.target.scrollTop +   event.target.clientHeight  -  event.target.scrollHeight * percent === 0

也就是说,它有一个percent的乘积累积上去。之所以这样做的原因是:

image.png

这个库做得更好一点,用的百分比而不是固定数值。

后记

当然,这个库还有上拉刷新的功能,这里就不研究啦

参考文档:
https://segmentfault.com/a/1190000016197930
https://segmentfault.com/q/1010000003795357

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 谢谢作者的文章 非常喜欢 请允许收藏! 博客园首页博问闪存新随笔订阅管理 vue之better-scroll的封装...
    peng凯阅读 16,576评论 2 5
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,261评论 4 61
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,802评论 1 45
  • 《追风筝的人》读后感 先说说我刚读完小说的心情,其实我是不怎么理解的,为什么哈桑会一直把阿米尔当作是自己的全世界,...
    山而先生阅读 340评论 0 0
  • 情绪就是心魔,你不控制它,它便吞噬你。 有多少次,因为情绪,你和伴侣之间大开争吵;有多少次,因为情绪,你摔门赌气向...
    成长着思考阅读 1,184评论 1 7