react中ListView组件

本文展示了如何在React应用中使用Ant Design的ListView组件创建一个长列表,并实现上拉加载更多的功能。主要步骤包括初始化ListView.DataSource,根据数据变更比较方法设置数据源,以及在组件挂载后和滑动到底部时获取并加载数据。示例代码详细解释了数据获取、状态管理和渲染过程。
摘要由CSDN通过智能技术生成

react中ListView组件,官方ant里面好多代码看的好复杂,最终做好后的简略代码供参考

创建ListView.DataSource 实例

class MyApprover extends React.Component {
	constructor(props) {
		super(props);
         // 创建ListViewDataSource对象
        const dataSource = new ListView.DataSource({
            // rowHasChanged(prevRowData, nextRowData); 用其进行数据变更的比较
            rowHasChanged: (row1, row2) => row1 !== row2 
        })

先把你需要放到长列表里的数据获取到,上拉加载更多的时候把状态库里的approverList进行每次concat链接

    // render之前执行
    componentDidMount() {
        this.getData(true)
	}
    // 获取我的审批
    getData(ref=false){
        let params ={
            pageSize:this.state.pageSize,
            pageNum:this.state.pageNum,
            toPhone:toPhone,
            keyWord:this.state.searchValue
        }
        AjaxService.post(URL.getApprovedList,params,res=>{
            const dataList=res.data.applyList
            const len=dataList.length
            // 判断是否已经没有数据了
            if(len<=0){
                this.setState({
                    isLoading:false,
                    hasMore:false
                })
                return false
            }
            // 上拉加载更多
            var approverList=this.state.approverList.concat(dataList)
            this.setState({
                pageNum:this.state.pageNum,
                dataSource:this.state.dataSource.cloneWithRows(approverList),//数据源中的数据本身是不可修改的,要更新datasour中的数据,每次重新调用clonewithrows方法
                isLoading:false,
                approverList:approverList,//保存新数据进state
            })
        },(error) => {
			let tip = error.readyState == 0 ? tipMsg.offlineTip : tipMsg.errTip;
			Toast.info(tip, 1);
		})
    }

滑动到底部加载更多

// 滑动到底部时加载更多
    _onEndReached(event){
        // 加载中或没有数据了都不在加载
        if(this.state.isLoading || !this.state.hasMore){
            return
        }
        this.setState({
            isLoading:true,
            pageNum:this.state.pageNum + 1,//加载下一页
        },()=>{
            this.getData(false)
        })
    }
    render() {
        const row=(rowData,sectionID,rowId)=>{
            return (
                <div className="myApprover" key={rowId}>
                    <div><p>{rowData.applyTime.slice(0,10)}</p><span className="tagTime">{rowData.applyTime.slice(11)}</span></div>
                    <div><p>{rowData.visitorName}</p><span className="tagTime">{rowData.fromCompany}</span></div>
                    <div style={{margin:"auto 0"}}>
                        <button className={[
                        "approve",rowData.applyStatus===-1?"approve-wait":
                        (rowData.applyStatus===0?"approve-areadly":(rowData.applyStatus===2?"approve-down":(rowData.applyStatus===4||6?"approve-over":"approve-visited")))].join(' ')} 
                        onClick={()=>browserHistory.push(`${Config.project}?${rowData.applyUrl}`)}>{rowData.applyStatusText}</button></div>
                </div>
            )
        }
return(
        <div className="myApproverBox">
            {/* 内容部分 */}
            <div className="invitelist_content_wrapper">
                <div className="invitelist_content">
                    <ListView
                    ref={el=>this.lv=el}
                    dataSource={this.state.dataSource}
                    renderFooter={() => (<div style={{ padding: 30, textAlign: 'center' }}>
                    {this.state.isLoading ? 'Loading...' : '没有更多数据了...'}
                    </div>)}
                    renderRow={row}
                    useBodyScroll
                    onEndReached={this._onEndReached.bind(this)}
                    onEndReachedThreshold={10}
                    pageSize={5}
                    />
                </div> 
            </div>
        </div>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值