Skip to content

loadMore

构造函数 update 版~(加入监听某个div中的滚动到底啦~)

function LoadMoreUpdate(config){
    this.el = config.el || '';
    this.cb = config.cb || function(){};
    this.loading = false;
    loadMoreUpdate.prototype.toEnd = function(){
        var scrollTop = this.el.scrollTop || document.body.scrollTop,
            pageHeight = this.el ? this.el.getBoundingClientRect().height : window.innerHeight,
            scrollHeight = this.el ? this.el.scrollHeight : document.body.scrollHeight;
        if(scrollTop + pageHeight > scrollHeight - 5) {
            if(this.loading) return;
            this.loading = true;
            this.cb();
        }
    }
    loadMoreUpdate.prototype.open = function(){
        this.listener = this.toEnd.bind(this);
        this.el ? this.el.addEventListener('scroll', this.listener, false) : window.addEventListener('scroll', this.listener, false);
    }
    loadMoreUpdate.prototype.close = function(){
        this.el ? this.el.removeEventListener('scroll', this.listener, false) : window.removeEventListener('scroll', this.listener, false);
    }
}

// 使用时:
var i = 0;
function addDIV(){
  setTimeout(function(){
    i++;
    //...
    SE.loading = false;
    if( i === 3) SE.close();
  },1000)
}
var SE = new LoadMoreUpdate(addDIV);
SE.open();

observer 版本:

// IntersectionObserver的下拉刷新
function observeLoadMore(el, cb) {
    this.el = el;
    this.isLoading = false;
    var option = {
        threshold: 0
    }
    this.observer =  new IntersectionObserver(() => {
      if(this.isLoading) return;
      else {
        this.loading = true;
        cb();
      }
    }, option);
    observeLoadMore.prototype.bind = () => this.observer.observe(this.el);
    observeLoadMore.prototype.unbind = () => this.observer.unobserve(this.el);
}

-----update:

React 版本:


/* 上拉加载的方法 */
const scrollMethod = () => {
    if (loading || loadingMore || !containerRef || !containerRef.current) {
        return;
    }

    if (containerRef.current.scrollHeight - containerRef.current.scrollTop <= containerRef.current.clientHeight + threshold) {
        loadMore();
    }
};

// 如果不用 ref,而用之前的 useCallbak,在某些情况下会出问题,造成拿到的 loading 不是最新的。
const scrollMethodRef = useRef(scrollMethod);
scrollMethodRef.current = scrollMethod;

/* 如果有 ref,则会上拉加载更多 */
useEffect(() => {
    if (!containerRef || !containerRef.current) {
        return () => {};
    }

    const scrollTrigger = () => scrollMethodRef.current();
    containerRef.current.addEventListener('scroll', scrollTrigger);

    return () => {
        if (containerRef && containerRef.current) {
            containerRef.current.removeEventListener('scroll', scrollTrigger);
        }
    };
}, [scrollMethodRef]);