zoukankan      html  css  js  c++  java
  • 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 (
        <div className='wrapper'>
          <div className='content'>
            {
              prop.children
            }
          </div>
        </div>
      )
    }

    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;
    }

    效果图

  • 相关阅读:
    System.Text.Json 自定义Converter实现时间转换
    WeihanLi.Npoi 根据模板导出Excel
    用 F# 手写 TypeScript 转 C# 类型绑定生成器
    【C#】写文件时如何去掉编码前缀
    一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具
    C#设计模式学习笔记:(15)迭代器模式
    【WPF学习】第四十六章 效果
    C# 如何实现完整的INI文件读写类
    Blend 修改TreeViewItem样式
    C#设计模式学习笔记:(16)观察者模式
  • 原文地址:https://www.cnblogs.com/-roc/p/15129088.html
Copyright © 2011-2022 走看看