react17 函数组件 使用 better-scroll2.0 封装方法 及 使用


接上文:

https://www.cnblogs.com/-roc/p/15102866.html

1、安装

cnpm install @better-scroll/core --save

cnpm install @better-scroll/pull-up --save

cnpm install @better-scroll/pull-down --save

2、封装 BScroll.jsx

(修改:增加 eslint-plugin-react-hooks  插件后,解决报错)

import React,{ useState, useEffect, useCallback } from 'react'; import './BScroll.less'; import BScroll from '@better-scroll/core' import Pullup from '@better-scroll/pull-up' import PullDown from '@better-scroll/pull-down';
BScroll.use(Pullup) BScroll.use(PullDown)
function BetterScroll (prop) {   // 获取传入的 方法   const { pullUp, pullDown } = prop   // 上拉加载   const fetchData = useCallback((bs) => {     pullUp(() => {       if (!bs) return       bs.finishPullUp()       bs.refresh()     })   }, [pullUp])   // 上拉刷新   const fetchRefresh = useCallback((bs) => {     pullDown(() => {       if (!bs) return       bs.finishPullDown()       bs.refresh()     })   }, [pullDown])   // 初始化bscroll   const [bScroll, setBScroll] = useState();   useEffect(() => {      // 初始化scroll     const bs = new BScroll('.wrapper', {       probeType: 3,       click: true,       pullUpLoad: true,       pullDownRefresh: true     })     console.log('首次');     // 首次进入获取数据     fetchRefresh(bs)     setBScroll(bs)     return () => {       //  组件卸载时记得将其销毁       setBScroll(null)     }     // eslint-disable-next-line   },[])
  // 上拉加载   useEffect(() => {     if(!bScroll) return;     // 必须清除 一次事件,否则会累加  暂时未想到其他好办法     bScroll.off('pullingUp')     // 只执行一次,防止累加     bScroll.once('pullingUp', () => {       console.log('上拉')       fetchData(bScroll)     })   }, [prop, bScroll, fetchData])
  // 下拉刷新   useEffect(() => {     if(!bScroll) return;     // 必须清除 一次事件,否则会累加  暂时未想到其他好办法     bScroll.off('pullingDown')     // 只执行一次,防止累加     bScroll.once('pullingDown', () => {       console.log('下拉')       fetchRefresh(bScroll)     })   }, [prop, bScroll, fetchRefresh])
  return (                     {           prop.children         }       
    
  ) }
export default BetterScroll;

3、BScroll.less

.wrapper {
  overflow: hidden;
  height: 100vh;
  // .content {
  //   // 底部显示不全
  //   padding: 0 0 60px; /* no */ 
  // }
}

4、使用 dent.jsx

import React, { useState } from 'react';
import './dent.less';
import { getPreAuthRecords } from 'apis';
import BScroll from 'src/base/BScroll/BScroll';

function dent () {
    const [records, setRecords] = useState([]);
    // 上拉
    const pullUpLoad = (fn) => {
        getPreAuthRecords()
        .then(res => {
            console.log(2);
            const data = [...records, ...res.data]
            setRecords(data)
            fn()
        })
    }
    // 下拉
    const pullDownLoad = (fn) => {
        getPreAuthRecords()
        .then(res => {
            console.log(1);
            const data = [...res.data]
            setRecords(data)
            fn()
        })
    }
    // 渲染
  return (
    <BScroll pullUp={pullUpLoad} pullDown={pullDownLoad}>
            {
                records.map( (item, i) => {
                    return <li className='listIten' key={item.ocId + i}>{`I am item ${i + 1} `}li>
                })
            }
        BScroll>
  )
}

export default dent;

5、dent.less

.content {
  // 底部显示不全
  padding: 0 0 60px; /* no */ 
}
.listIten {
  font-size: @font-size-medium;
  padding: 30px;
}

效果图