zoukankan      html  css  js  c++  java
  • 使用Scrollbar组件实现滚动加载下一页数据

    效果图:

    如果还有数据,显示正在加载中,没有下一页数据了显示无更多数据

    做法:

    在state中设置表头信息structure、数据列表list、是否加载下一页isLoad

    state={
        structure: [
          {
            name: '排名',
             '15%',
            key: 'order',
            textAlign: 'center',
            formatter: (data, i) =>
              <span className={styles.order} style={{
                color: this.getColor(i),
                fontWeight: i < 3 ? 'bold' : 'normal',
                fontStyle: i < 3 ? 'italic' : 'normal',
              }}>
                {i + 1}
              </span>,
          }, {
            name: '企业名称',
             '70%',
            key: 'enterprise',
          }, {
            name: '人才',
             '15%',
            key: 'num',
            textAlign: 'center',
            formatter: (data, i) =>
              <span>
                {data.num}人
              </span>,
          },
        ],
        list:[],
        isLoad:false,//是否加载下一页
    }

    设置this属性

    pageIndex=1//page初始化
    pageSize=20//每页获取条数
    isfinsh=false//是否加载完成

    表头设置

    <div className={styles.head}>
        {
            structure.map(s =>
                <div key={s.key} className={styles.col} style={{  s.width, textAlign: 'center' }}>
                {s.name}
                </div>,
            )
        }
    </div>

    表体设置:

    Scrollbar的scroll是滚动到最底部触发。list遍历。isLoad用于展示当前是加载下一页还是无下一页。Icon是antd引入的

    <Scrollbar className={styles.listBody} scroll={this.scroll.bind(this)}>
        {
            list.map((l, i) =>{
                return (
                <div key={i} className={styles.row}>
                    {
                    structure.map(s =>
                    <div key={s.key} className={styles.col} style={{  s.width, textAlign: s.textAlign }}>
                    {s.formatter ? s.formatter(l, i) : l[s.key]}
                    </div>)
                    }
                </div>
                )
            })
        }
        {
            this.state.isLoad?
            <div className={styles.loading}>
                <Icon type='loading' size='xxs'/>
                <span>正在加载中...</span>
            </div>
            :
            <div className={styles.noMore}>暂无更多数据</div>
        }
    </Scrollbar>

    滚动到最底部scroll函数:要做判断,若当前未在加载下一页且未完成全部加载,则将isLoad变为true,防止scroll多次触发产生多次请求,就是一种防抖方式。开始一次请求。

    scroll(e){
        if(!this.state.isLoad && !this.isfinsh){
            this.state.isLoad=true
            this.pageIndex++
            this.setState({isLoad:true},()=>{
                this.getIndex()//请求
            })
        }
    }

    请求时将数据拼接到list中。

    componentDidMount() {
        this.getIndex()//刚进页面一次请求
    }
    //请求
    getIndex(){
        this.props.dispatch({ type: 'xxx/getIndex',payload:{
            pageSize:this.pageSize,
            pageIndex:this.pageIndex,
        }}).then(data=>{
            if(data.Code===2000){
                this.setState({isLoad:false})//请求到数据后变为不加载状态
                if(data.Data.length==0){
                    this.isfinsh=true//请求的数据没有了,就表示完成
                    return;
                }
                let list=this.state.list||[]
                this.setState({list:list.concat(data.Data)})//将新的数据拼到原数组中
            }
        });
    }

    Scrollbar滚动条的实现:https://www.cnblogs.com/wuhairui/p/13673408.html

  • 相关阅读:
    由DataSet导出生成excel的几种方法
    linq日期查询
    上传文件
    C#获取文件的MD5值
    设置图层透明度
    highcharts中的x轴如何显示时分秒时间格式
    axios中文文档
    如何在 Highcharts 图中当所占百分比为 0 时不显示0%
    一个简易的选择小时(时分秒)的插件
    三分钟上手Highcharts简易甘特图
  • 原文地址:https://www.cnblogs.com/wuhairui/p/13685910.html
Copyright © 2011-2022 走看看