移動端前端需要實現分頁功能,與傳統的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/
