AntDesign 长列表的使用

本文介绍了一种在大量数据环境下,通过滑动加载和数据分页技术优化用户体验的方法。利用React组件和Ant Design库,实现了动态加载数据,避免了一次性加载全部数据导致的性能瓶颈。文章详细解释了如何通过参数控制数据加载,以及如何在底部显示加载提示。

由于数据量比较大,加载时不一次性加载全部数据,而是通过参数page_size加载数量、current_page当前页两个参数查询数据,实现滑动加载

<ListView
    className="applyList"
    key={this.state.useBodyScroll ? '0' : '1'}
    ref={el => this.lv = el}
    dataSource={this.state.dataSource} //数据来源
    renderFooter={() => (
        <div style={{ padding: 30, textAlign: 'center', color: "#007AFF"}}>
            {this.state.hasMore ? '正在刷新...' : '已显示全部数据'}
        </div>
    )}
    renderRow={row} //子组件样式
    renderSeparator={separator}
    useBodyScroll={this.state.useBodyScroll}
    className="container"
    style={this.state.useBodyScroll ? {} : {height: this.state.height,} }
    initialListSize = {10}
/>

render

let row;
if(this.state.rowCount > 0){
    row = (rowData, sectionID, rowID) => {
        var item = rowData;
        //return出子组件
        return (
            <MessageCard 
                applyId={item.hasOwnProperty('apply_id')?item.apply_id:''} //申请id
                states={item.hasOwnProperty('states')?item.states:''} //当前订单状态
                state={item.hasOwnProperty('state')?item.state:''} //当前流程状态
                adminName={item.hasOwnProperty('admin_name')?item.admin_name:''} //管理员名称
                beginTime={item.hasOwnProperty('begin_time')?item.begin_time:''} //开始时间
                endTime={item.hasOwnProperty('end_time')?item.end_time:''} //结束时间
            />
        );
    };
}

定义查询方法

//查询数据
async getBorrowData(params){
    //console.log(this.state.Lists)
    this.setState({isLoading: true})
    try{
    	//调用后台接口
        let data = await service.useQuery(params);
        //状态码,1代表成功
        if (data.RetCode === '1') {
        	//将新查询出的数据拼接到原有数据尾部
            let list = this.state.Lists.concat(data.DataRows);
            //如果没有更多数据
            if(data.DataRows.length < this.state.pageSize) {
            	//设置状态,false将显示底部,并且不会继续触发滑动加载
                this.setState({hasMore: false})
            }
            //数据总量
            let rowCountNum = this.state.rowCount + data.DataRows.length;
            //设置状态,dataSource为antd要求格式
            this.setState({
                Lists: list,
                dataSource: this.state.dataSource.cloneWithRows(list),
                rowCount: rowCountNum,
            })
        }else{
            this.setState({
                Lists: this.state.Lists,
                dataSource: this.state.dataSource.cloneWithRows([]),
                rowCount: this.state.rowCount,
            })
        }
    }catch(e){
        Toast.fail(e.message)
    }
}

定义滑动加载

//滑动加载信息
 onEndReached = () => {
     let params = {};
     params.page_size = this.state.pageSize;
     params.current_page = ++pageIndex;
     if(this.state.hasMore){
     	this.getData();
     	
     } 
 };
### Ant Design React 表单中的锚点使用Ant Design 中,`Anchor` 组件提供了实现页面内跳转的功能。如果希望在 React 表单中集成锚点功能,则可以通过 `Form` 和 `Anchor` 的组合来完成这一需求。 以下是具体方法: #### 1. 安装依赖 确保已安装 Ant Design 及其相关依赖项。 ```bash npm install antd ``` #### 2. 创建表单并结合 Anchor 使用 通过将 `Anchor.Link` 放置到表单的不同部分,可以实现在表单内部快速定位特定字段区域的效果[^1]。 下面是一个完整的示例代码: ```jsx import React from 'react'; import { Form, Input, Button, Anchor } from 'antd'; const { Link } = Anchor; const App = () => { const onFinish = (values) => { console.log('Success:', values); }; return ( <div> {/* 锚点导航 */} <Anchor style={{ float: 'right', position: 'fixed' }}> <Link href="#username" title="Username" /> <Link href="#email" title="Email" /> <Link href="#password" title="Password" /> </Anchor> {/* 表单主体 */} <Form name="form_with_anchor" initialValues={{ remember: true }} onFinish={onFinish} scrollToFirstError > {/* 用户名输入框 */} <Form.Item id="username" name="username" label="Username" rules={[{ required: true, message: 'Please input your username!' }]} > <Input placeholder="Enter Username" /> </Form.Item> {/* 邮箱输入框 */} <Form.Item id="email" name="email" label="E-mail" rules={[ { type: 'email', message: 'The input is not a valid E-mail!' }, { required: true, message: 'Please input your E-mail!' }, ]} > <Input placeholder="Enter Email" /> </Form.Item> {/* 密码输入框 */} <Form.Item id="password" name="password" label="Password" rules={[{ required: true, message: 'Please input your password!' }]} > <Input.Password placeholder="Enter Password" /> </Form.Item> {/* 提交按钮 */} <Form.Item> <Button type="primary" htmlType="submit"> Submit </Button> </Form.Item> </Form> </div> ); }; export default App; ``` #### 3. 关键点解析 - **Anchor 组件**:用于定义页面内的链接导航条目。每个 `<Link>` 对应一个目标位置,需设置唯一的 `href` 属性以便匹配对应的 DOM 节点。 - **Form.Item ID 设置**:为了使锚点能够正确指向某个表单项,在对应的目标节点上添加唯一标识符(如 `id` 或其他可选属性)。上述例子中直接设置了 `id` 来作为锚点目标。 #### 4. 效果说明 运行此代码后,右侧会显示固定的锚点列表,点击任意一项即可滚动至相应表单项的位置。这有助于提升用户体验,尤其是在复杂或较长的表单场景下非常实用。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值