react 上拉加载组件的使用

移动端前端需要实现分页功能,与传统的pc端分页不同,决定使用蚂蚁的长列表组件,支持上拉加载及下拉刷新(本文只涉及上拉加载)

引入组件:

import {  ListView } from 'antd-mobile';

 

定义一些初始状态:

constructor(){
        super();
        const ds = new ListView.DataSource({
          rowHasChanged: (r1, r2) => r1 !== r2
        });
        this.state={
            page:"1", //页码
            row:'10', // 每页条数
            totalPage:"", //总页数
            dataSource: ds, //长列表加载数据源
            billData:[],  //每页数据
            preBillData:[], //原始的订单列表
            allBillData:[], //原始的+每一页新的数据
            isLoading :true,  //是否加载中
            isHasMore :false, //是否还有更多数据
         };
 }

调用组件:

         <ListView
                ref={el => this.lv = el}
                dataSource={this.state.dataSource} 
                renderFooter={() => (<div style={{ padding:5, textAlign: 'center',fontSize:'14px' }}>
                    {
                        isHasMore && ( isLoading ? <span className='list_loading'>加载中...</span> : '已加载')
                    }
                    {
                        billData.length!=0 && (!isHasMore && '没有更多内容')
                    }

                </div>)}
                renderRow={row} //每行数据渲染
                style={{
                  minHeight:'calc(100vh - 20px)', //高度需要定义
                  overflow: 'auto',
                }}
                pageSize={10}  //一次渲染几条数据
                onEndReached={this.onEndReached} 
                onEndReachedThreshold={10} 
           />    

选择每行数据

// 渲染每一行数据
    const row = (rowData, sectionID, rowID) => {
        return(
            <div>
              <div>{rowData.username}</div>
              <div>{rowData.billNo}</div>
              ...
            </div>
        )
    }  

 上拉加载更多:

 onEndReached = () => {
      
   const {page,row,totalPage,isLoading,isHasMore} =  this.state
   
   //当前已加载的条数小于total总条数 请求下一页数据,否则停止请求数据
   if((Number(page)-1) < Number(totalPage)){
       this.setState({
           isLoading: true
       })
       this.getBatchData()
   }else{
       this.setState({
           isLoading:false,
           isHasMore:false
       })
   }
  }

 分页请求数据成功后:

数据源dataSource接受的参数是当前页数据加上之前的原始数据

若某些时候需要清除数据源重新渲染,如同页面筛选过滤时,直接把dataSource:[ ] 是不起作用的,需要创建一个新的空数组如下:

et emptyList = allBillData.splice(0,allBillData.length)  //把原来的数据源清空再生成一个空数据

this.setState({
       page:'1', //页码变为1
       dataSource:this.state.dataSource.cloneWithRows(emptyList) //传入一个空数组
}

  

 更多用法见https://mobile.ant.design/components/list-view-cn/

  

原文地址:https://www.cnblogs.com/javenlee/p/10736167.html