antd Pagination 组件绑定回调函数问题整理

背景

react 前端框架,antd 库提供了分页和列表组件,本文整理分页组件的 onChangeonShowSizeChange 事件回调函数绑定时需要注意的问题。

分页组件问题描述

分页组件点击分页和 pageSize 的时候,需要调用当前组件的 doSearch 方法发送 ajax 请求给后台,请求对应页的数据。但是实现的时候,始终无法访问到当前组件的函数和 this.state 信息。

我的用法是,直接绑定函数:

<Pagination style={{marginTop:"10px",float:"right"}}
     total={this.state.total || 0}
     showSizeChanger // 是否可以改变pageSize
     showQuickJumper={false}// 是否可以快速跳转某一页
     onShowSizeChange={this.change}
     onChange={this.sizeChange}
     showTotal={_totalCount => `${_totalCount}`}
     current={this.state.pageNo || 1}
     pageSize={this.state.pageSize || 10}
   />

直接指定事件为当前组件的函数的时候,函数中的 this 对象并不是当前组件,而是分页组件自身,反正就是无法访问到父组件的函数和属性。

在这里插入图片描述
change 函数中 this.doSearch 始终报错,因为被调用时 this 已经转移了。
这个问题困扰了两天,终于在万能的互联网的帮助下找到了两种解决办法。

方法一:为函数 bind 绑定 this

配置分页属性信息,并为函数绑定 this.change.bind(this) 对象为当前组件。

const paginationProp = {
     currentPage: this.state.pageNo,
      pageSize: this.state.pageSize,
      totalCount: this.state.total,
      onChange: this.change.bind(this),
      onShowSizeChange: this.sizeChange.bind(this),
  }
        
<Pagination style={{marginTop:"10px",float:"right"}}
     total={this.state.total || 0}
     showSizeChanger // 是否可以改变pageSize
     showQuickJumper={false}// 是否可以快速跳转某一页
     showTotal={_totalCount => `${_totalCount}`}
     current={this.state.pageNo || 1}
     pageSize={this.state.pageSize || 10}
     {...paginationProp}
 />

方法二:回调函数编写调用

<Pagination style={{marginTop:"10px",float:"right"}}
    total={this.state.total || 0}
    showSizeChanger // 是否可以改变pageSize
    showQuickJumper={false}// 是否可以快速跳转某一页
    onShowSizeChange={(page,pageSize)=> this.doSearch(pageSize,page,this.state.keyword)}
    onChange={(page,pageSize)=> this.doSearch(pageSize,page,this.state.keyword)}
    showTotal={_totalCount => `${_totalCount}`}
    current={this.state.pageNo || 1}
    pageSize={this.state.pageSize || 10}
/>

函数设置中直接调用到父组件的函数,而不是直接传递当前父组件的函数。

启示录

接触一个新技术的时候,总有很多坑点不知道。

React-antd中,`Pagination`组件自带了默认的分页样式和功能,包括下拉框。如果你想要自定义分页下拉框,你可以通过以下几个步骤操作: 1. **替换组件**: 首先,你需要从`Pagination`组件中移除它的`Dropdown`部分。这通常可以通过传递`onChange`和`onchangeExtra`等事件属性来实现,因为它们控制着分页下拉框的行为。 ```jsx import { Pagination } from 'antd'; const CustomPagination = ({ total, onChange }) => { return ( <Pagination total={total} pageSizeOptions={['10', '20', '30', '40']} current={1} showSizeChanger={false} // 关闭默认的下拉框 onChange={onChange} // 保留更改当前页码的回调 /> ); }; ``` 2. **手动添加下拉框**: 如果你还是想让用户可以选择页面大小,可以自己创建一个可交互的元素,并绑定`onChange`事件。例如,可以使用`Select`组件或其他选择器组件。 ```jsx import Select from 'antd/lib/select'; // ... const paginationDropdown = ( <div> <label>每页显示:</label> <Select options={['10', '20', '30', '40']} value={pageSizeOption} onChange={(value) => onChange({ pageSize: parseInt(value), current: 1 })} /> </div> ); ``` 3. **合并组件**: 将自定义的分页按钮和选择器组合在一起,并将`onChange`函数作为两者共同的更新策略。 ```jsx const CustomPaginationWithDropdown = (props) => { const [pageSizeOption, setPageSizeOption] = React.useState('10'); const handleChange = (params) => { setPageSizeOption(params.pageSize); onChange(params); }; return ( <> {paginationDropdown} <CustomPagination total={props.total} onChange={handleChange} /> </> ); }; ``` **相关问题--:** 1. 我们如何处理用户在分页下拉框中选择同的页面大小时的事件? 2. 是否可以直接覆盖`Pagination`的CSS来自定义外观,而是完全替换它? 3. 如何在`CustomPaginationWithDropdown`组件中保持状态一致性,如总页数的变化会自动更新分页下拉选项?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值