聊聊antdesign表格在分页情况下,如何在react中实现跨页后选中的数据还在

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

今天在写项目时,遇到一个前端分页展示的表格,需要在跨页时保留之前选中的数据,但由于我们是动态向后端请求的数据,所以需要前端来保留这个数据。


一、子组件

我们可以在表格单选或者全选的时候给该行数据添加一个标识来判断当前行是否选中或该页数据是否被全选。

代码如下(示例):

//表格的配置项 

selectTableKey(a,b,c)//该方法为传回父组件的方法(第一个参数是选中的key-数组,第二个参数是选中的数据-数组,第三个参数是用于父组件判断是单选还是多选)

//selectedRows为父组件传回的shang上一次选中的全部数据

  const rowSelection = {

    selectedRowKeys, // 选中的行key

    onChange: onSelectChange, // 选中行变化时的回调

    onSelect: (record: list, selected: boolean) => {

      // 选中行

      const arr: list[] = [{

        ...record,

        isSelect: selected

      }]

      selectTableKey(arr, 0)

    },

    onSelectAll: (selected: boolean, rows: list[], changeRows: list[]) => {

      if (selected) {

        // 全选

        rows = rows.map((el: list) => ({

          ...el,

          isSelect: selected

        }))

      } else {

        // 取消全选

        rows = selectedRow.map((el: list) => ({

          ...el,

          isSelect: changeRows.some((item: list) => item.key === el.key)

        }))

      }

      selectTableKey(rows, 1)

    }

  }

  //监听到父组件传回的数据,更新表格数据及选中状态

  useEffect(() => {

    setSelectedRows(selectTableData)

    setSelectedRowKeys(selectTableData.map(el=>el.key))

  }, [selectTableData])

二、父组件

代码如下(示例):

  // 获取右边表格选中数据

  const [selectedTableKeys, setSelectedTableKeys] = useState([]);

  const [selectTableData, setSelectTableData] = useState([]);

  //没有选中,找到该项删除,反之添加

  const selectTableKey = useCallback((selectKeys, selectArr, type) => {

    let  newArr = selectTableData

    // type-0单选 type-1多选

    if (!type) {

      if (!selectArr[0].isSelect) {

        const findIndex = newArr.findIndex(el => selectArr[0].key === el.key)

        newArr.splice(findIndex, 1)

      } else newArr.push(selectArr[0])

    } else {

      selectArr.forEach(item => {

        const findIndex = newArr.findIndex(el => item.key === el.key)

        if (findIndex === -1 && item.isSelect && item.key)newArr.push(item)

        else if (findIndex !== -1 && !item.isSelect)newArr.splice(findIndex, 1)

      })

    }

    setSelectedTableKeys(newArr.map(el => el.key));

    setSelectTableData(newArr);

  }, [selectedTableKeys]);


总结

总的来说这个功能还是非常简单的,也是记录自己第一次写这个需求,小白一枚,如果有更好的方法以及错误的地方,欢迎大家纠正。

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React 使用 Ant Design分页组件,并在每页放入数据,你可以采用以下步骤: 1. 首先,你需要安装 `antd` 包,可以通过以下命令进行安装: ``` npm install antd ``` 2. 在你的组件引入 `Pagination` 组件和需要分页显示的数据: ```jsx import { Pagination } from 'antd'; class PageComponent extends React.Component { constructor(props) { super(props); this.state = { data: [], // 分页数据 currentPage: 1, // 当前页码 pageSize: 10, // 每页显示条数 total: 0 // 数据总数 }; } // 获取分页数据 fetchData = (page, pageSize) => { // 根据当前页码和每页显示条数获取数据 // 这里只是一个示例,实际项目要根据实际需求进行修改 const data = [ { id: 1, name: '张三', age: 20 }, { id: 2, name: '李四', age: 22 }, { id: 3, name: '王五', age: 24 } ]; const total = 3; // 数据总数 this.setState({ data, total }); }; // 处理页码改变事件 handlePageChange = (page, pageSize) => { this.setState( { currentPage: page, pageSize }, () => { this.fetchData(page, pageSize); } ); }; // 渲染分页数据 renderData = data => { return data.map(item => { return ( <div key={item.id}> <p>姓名:{item.name}</p> <p>年龄:{item.age}</p> </div> ); }); }; render() { const { data, currentPage, pageSize, total } = this.state; return ( <div> {this.renderData(data)} <Pagination current={currentPage} pageSize={pageSize} total={total} onChange={this.handlePageChange} /> </div> ); } } export default PageComponent; ``` 在上述代码,我们定义了一个 `PageComponent` 组件,其包含了一个 `fetchData` 函数用于获取分页数据,一个 `handlePageChange` 函数用于处理页码改变事件,以及一个 `renderData` 函数用于渲染分页数据。 在 `render` 方法,我们首先通过 `this.renderData(data)` 渲染了当前页的数据,然后使用 `Pagination` 组件进行分页显示,并通过 `current`、`pageSize` 和 `total` 属性指定了当前页码、每页显示条数和总数据条数。 在 `Pagination` 组件的 `onChange` 属性,我们设置了一个回调函数 `handlePageChange`,用于在页码改变时重新获取分页数据并更新组件状态。 希望这个回答能够帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值