沉锅 發表於 2020-3-27 12:00:00

react + better-scroll 实现下拉刷新 上拉加载更多

<p>1.封装组件</p>
<p>components/Scroll/index.tsx</p>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">/**
* 下拉刷新 上拉加载更多
*/
import React, { forwardRef, useState,useEffect, useRef, useImperativeHandle, useMemo } from "react"
import PropTypes from "prop-types"
import BScroll from "better-scroll"
import Loading from '../loading/index';
import Loading2 from '../loading-v2/index';
import debounce from "utils/debounce";
import './index.less';

const Scroll = forwardRef((props:any, ref:any) =&gt; {
const = useState&lt;any&gt;();

const scrollContaninerRef:any = useRef();

const { direction, click, refresh, pullUpLoading, pullDownLoading, bounceTop, bounceBottom } = props;

const { pullUp, pullDown, onScroll } = props;

let pullUpDebounce = useMemo(() =&gt; {
    return debounce(pullUp, 500)
}, );

let pullDownDebounce = useMemo(() =&gt; {
    return debounce(pullDown, 500)
}, );

useEffect(() =&gt; {
    const scroll:any = new BScroll(scrollContaninerRef.current, {
      scrollX: direction === "horizental",
      scrollY: direction === "vertical",
      probeType: 3,
      click: click,
      bounce:{
      top: bounceTop,
      bottom: bounceBottom
      }
    });
    setBScroll(scroll);
    return () =&gt; {
      setBScroll(null);
    }
    // eslint-disable-next-line
}, []);

useEffect(() =&gt; {
    if(!bScroll || !onScroll) return;
    bScroll.on('scroll', onScroll)
    return () =&gt; {
      bScroll.off('scroll', onScroll);
    }
}, );

useEffect(() =&gt; {
    if(!bScroll || !pullUp) return;
    const handlePullUp = () =&gt; {
      //判断是否滑动到了底部
      if(bScroll.y &lt;= bScroll.maxScrollY + 100){
      pullUpDebounce();
      }
    };
    bScroll.on('scrollEnd', handlePullUp);
    return () =&gt; {
      bScroll.off('scrollEnd', handlePullUp);
    }
}, );

useEffect(() =&gt; {
    if(!bScroll || !pullDown) return;
    const handlePullDown = (pos: any) =&gt; {
      //判断用户的下拉动作
      if(pos.y &gt; 50) {
      pullDownDebounce();
      }
    };
    bScroll.on('touchEnd', handlePullDown);
    return () =&gt; {
      bScroll.off('touchEnd', handlePullDown);
    }
}, );


useEffect(() =&gt; {
    if(refresh &amp;&amp; bScroll){
      bScroll.refresh();
    }
});

useImperativeHandle(ref, () =&gt; ({
    refresh() {
      if(bScroll) {
      bScroll.refresh();
      bScroll.scrollTo(0, 0);
      }
    },
    getBScroll() {
      if(bScroll) {
      return bScroll;
      }
    }
}));

const PullUpdisplayStyle = pullUpLoading ? { display: "" } : { display: "none" };
const PullDowndisplayStyle = pullDownLoading ? { display: "" } : { display: "none" };
return (
    &lt;div className="scroll_container" ref={scrollContaninerRef}&gt;
      {props.children}
      {/* 滑到底部加载动画 */}
      &lt;div className="pull_up_loading" style={ PullUpdisplayStyle }&gt;&lt;Loading&gt;&lt;/Loading&gt;&lt;/div&gt;
      {/* 顶部下拉刷新动画 */}
      &lt;div className="pull_down_loading" style={ PullDowndisplayStyle }&gt;&lt;Loading2&gt;&lt;/Loading2&gt;&lt;/div&gt;
    &lt;/div&gt;
);
})

Scroll.defaultProps = {
direction: "vertical",
click: true,
refresh: true,
onScroll:null,
pullUpLoading: false,
pullDownLoading: false,
pullUp: null,
pullDown: null,
bounceTop: true,
bounceBottom: true
};

Scroll.propTypes = {
direction: PropTypes.oneOf(['vertical', 'horizental']),
refresh: PropTypes.bool,
onScroll: PropTypes.func,
pullUp: PropTypes.func,
pullDown: PropTypes.func,
pullUpLoading: PropTypes.bool,
pullDownLoading: PropTypes.bool,
bounceTop: PropTypes.bool,//是否支持向上吸顶
bounceBottom: PropTypes.bool//是否支持向下吸顶
};

export default Scroll;</pre>
</div>
<p>2.页面调用</p>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">import Scroll from 'components/Scroll';
...
&lt;Scroll
// onScroll={forceCheck}
pullUp={handlePullUp}
pullDown={handlePullDown}
ref={scrollRef}
pullUpLoading={pullUpLoading}
pullDownLoading={pullDownLoading}
&gt;
&lt;ul className="list_content clearfix"&gt;
    {
      searchList.toJS().map((item:any) =&gt;{
      return (
          &lt;li key={item.comic_id}&gt;
            &lt;Link to={"/categoryPage/category/detail?id=" + item.comic_id}&gt;
            &lt;img src={item.cover} alt="" /&gt;
            &lt;span className="category_txt clearfix"&gt;
                &lt;strong&gt;{item.title}&lt;/strong&gt;
                &lt;span&gt;
                  &lt;em&gt;{item.message}&lt;/em&gt;
                  &lt;em&gt;{item.good}&lt;/em&gt;
                &lt;/span&gt;
            &lt;/span&gt;
            &lt;/Link&gt;
          &lt;/li&gt;
      )
      })
    }
&lt;/ul&gt;
&lt;/Scroll&gt;</pre>
</div>
<p>.</p><br><br>
来源:https://www.cnblogs.com/crazycode2/p/12589226.html
頁: [1]
查看完整版本: react + better-scroll 实现下拉刷新 上拉加载更多