前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >React+Antd+ProTable 表格跨页选择

React+Antd+ProTable 表格跨页选择

原创
作者头像
起名字好难iii
发布2024-01-29 12:48:18
发布2024-01-29 12:48:18
96800
代码可运行
举报
运行总次数:0
代码可运行

需求

  1. 需要使用 antd pro的表格进行分页多选
  2. 多选的时候, 不能只返回 id , 而是需要返回 id/name/link
  3. 回显数据也需要同样的字段返回, 然后进行分页的回显

思路

简单查阅 ant design pro的文档后,可以发现他是有一个多选的属性 rowSelection所以我们就先用这个进行实验

代码语言:javascript
代码运行次数:0
运行
复制
 // ProTable 
 rowSelection={{
   // 自定义选择项参考: https://ant.design/components/table-cn/#components-table-demo-row-selection-custom
   defaultSelectedRowKeys: [1],
 }}

经过上面的一个代码, 你会发现, 其实整体的效果已经完成了一半了, 因为antd Pro其实已经封装好了一个分页多选, 但是他只能返回 [1,2,,3,,4]这样子的数据结构, 目前和我们想要的数据结构不一样, 所以还需要改造

思路 :

  1. 找寻是否有 onChange或者 onSelect这类的操作函数
  2. 是否能够通过以上找寻的函数进行重构返回的数据

最后我找寻到的 api 如下

onSelect - 单行选择

onSelectMultiple - 多行选择(使用shift键可以触发多选)

onSelectAll - 全选全不选

onChange - 每次选择行都会触发onChange,并且是后执行。

那这个时候我们就需要想一下跨页选择的逻辑了, 因为按照他目前给的 api我们就只能重构他的返回数据了, 例如说我目前想的一个逻辑

cancelRowKeys取消选中的变量

selectedRowKeys 选中的数据的变量

  1. onSelect判断一下当前选择的是取消/还是选择 , 然后用一个变量cancelRowKeys进行接受
  2. onChange中进行数据的处理
  3. cancelRowKeys有值则从已经选中的selectedRowKeys中清除掉当前的cancelRowKeys, 并且清空cancelRowKeys
  4. cancelRowKeys没有值则把数据添加到selectedRowKeys中,并且清除重复的数据

实现

代码语言:javascript
代码运行次数:0
运行
复制
 const [drawerSelectGoods, setDrawerSelectGoods] = useState([]) // 选择的商品
 let cancelRowKeys = [] // 取消选择的项目
 ​
 const formatList = list => {
   return list.map(item => {
     const commonProps = {
       name: item.goods_name,
       id: item.id,
       type: 'product'
     }
 ​
     if (list.length === 1) {
       return {
         ...commonProps,
         link: `/pages/index/goodsDetails/goodsDetails?id=${item.id}`,
         display_category_list: false
       }
     } else {
       return {
         ...commonProps,
         link: `/pages/category/categoryList/categoryList`,
         display_category_list: true
       }
     }
   })
 }
 ​
 <ProTable
   rowSelection={{
     selectedRowKeys: drawerSelectGoods.map(i => i.id), // 回显需要
     onChange: (keys, rows) => {
       let tempList = [...rows, ...drawerSelectGoods.filter(i => !keys.includes(i.id))]
       if (cancelRowKeys.length) {
         setDrawerSelectGoods(formatList(tempList.filter(i => !cancelRowKeys.includes(i.id))))
       } else {
         setDrawerSelectGoods(formatList(tempList))
       }
     },
   
     onSelect: (record, selected) => {
       if (!selected) {
         cancelRowKeys = [record.id]
       }
     }
   }}
 />

回显

代码语言:javascript
代码运行次数:0
运行
复制
 // 选择分类 / 商品 处理
   const handleCascaderChange = async (e, type) => {
     let event
     if (type === 'open') {
       event = e[0]
     } else if (type === 'edit') {
       event = e[0].type
     }
 ​
     if (event === 'product') {
       triggerGoodsDrawer()
       if (value && value.length) {
         setDrawerSelectGoods(value)
       }
     }
   }

回显在我这里就是比较简单的了, 就是直接获取到数据之后, 进行赋值即可

效果展示

🐤我非常乐意听取您的疑问和想法,欢迎在评论区留言

🐰您的每一条评论对我都至关重要,我会尽快回复

🎈如果这篇文章对您有所启发或帮助,欢迎赞赏、收藏或分享

🎁您的每一个动作都是对我创作的最大鼓励和支持

👍感谢您的阅读和陪伴,希望我的文章能给您带来一些帮助

🍻感谢您的支持,我会继续努力创作更多有价值的内容!

这篇文章的内容就介绍到这里,期待我们下次的相遇。感谢您花时间阅读,如果有任何问题或想法,欢迎在评论区留言。

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求
  • 思路
  • 实现
  • 回显
  • 效果展示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档