• antd中嵌套表格,子表格数据相同的问题解决(hook写法)


    相信很多朋友在使用antd的嵌套表格的时候都碰到了这个问题,本人也深有体会,简直愁的不行,不过在经过和百度的一番争斗之后,终于是找到的问题的原因所在。

    首先,antd的表格数据源dataSource接收的是一个数组,如果我们子表格每次接收的数组都是一个单独的新的数组,那么就会造成所有的子表格都是一样的,因为每次展开只渲染了这一个数组

    那么我们就要把每次请求到的子表格数据给存起来了,这里我用的是对象键值对的方式去存储的

    因为没有后台数据,所以我这边就先模拟了一些数据

    const ChildrenDataOne = [
      { name: 'XiaoHua1', age: 15, address: 'ZhengZhou', key: 0 },
      { name: 'XiaoHua2', age: 15, address: 'ZhengZhou', key: 1 },
      { name: 'XiaoHua3', age: 15, address: 'ZhengZhou', key: 2 },
    ]
    const ChildrenDataTwo = [
      { name: 'XiaoBai1', age: 15, address: 'ZhengZhou', key: 0 },
      { name: 'XiaoBai2', age: 15, address: 'ZhengZhou', key: 1 },
      { name: 'XiaoBai3', age: 15, address: 'ZhengZhou', key: 2 },
    ]
    const ChildrenDataThree = [
      { name: 'XiaoHei1', age: 15, address: 'ZhengZhou', key: 0 },
      { name: 'XiaoHei2', age: 15, address: 'ZhengZhou', key: 1 },
      { name: 'XiaoHei3', age: 15, address: 'ZhengZhou', key: 2 },
    ]
    const ChildrenDataFour = [
      { name: 'XiaoLan1', age: 15, address: 'ZhengZhou', key: 0 },
      { name: 'XiaoLan2', age: 15, address: 'ZhengZhou', key: 1 },
      { name: 'XiaoLan3', age: 15, address: 'ZhengZhou', key: 2 },
    ]

    这个方法每次点击展开按钮时会把相对应的数据存入到 data 这个对象中,大概效果是 { 1: [ 数据 ], 3: [  数据 ], 2: [  数据 ] }

     1   const openClick = (status, item) => { // status(子表格展开的状态) item(当前项)
     2     if (!status) return 
     3    // 判断 如果子表格收起时 直接退出当前函数,不进行请求存储
     4     if (item.Cid === 1) {
     5       setData({ ...data, [item.Cid]: ChildrenDataOne })
     6     }
     7     if (item.Cid === 2) {
     8       setData({ ...data, [item.Cid]: ChildrenDataTwo })
     9     }
    10     if (item.Cid === 3) {
    11       setData({ ...data, [item.Cid]: ChildrenDataThree })
    12     }
    13     if (item.Cid === 4) {
    14       setData({ ...data, [item.Cid]: ChildrenDataFour })
    15     }
    16   }

    好,现在我们有了所有展开的数据,但是因为存储到对象里面,所以我们还需要一个 唯一值(id)每次取匹配我们存储到对象里面的数据

    这个方法是渲染子表格用的,它第一个参数是所有展开的对应的数据,我们就可以从这些数据中取到唯一值(id)

    可能有小伙伴疑问了为什么要从这里取,因为它第一个参数输出的是(所有展开的数据),也就是说我们可以拿到所有已展开的id,然后将对应的数据给放进去

    我这边也是踩过坑的,我每次展开的时候存了一个id,然后就导致了我虽然有每个展开的数据,但是没有每个展开的id,就造成了都是一样的数据

      const expandedRowRender = (item) => {
        return (
          <Table
            columns={ChildrenColumns}
            pagination={false}
            dataSource={data[item.Cid]}
          />
        )
      }

    这里是全部的代码,这边是没有使用 redux或者dva,仅仅是使用state在页面上模拟了一下,不过思路是正确的,小伙伴们把思路看懂了,然后搬到redux/dva里面就可以了

    import React, { useState } from 'react'
    import { Table } from 'antd'
    import {
      ParentData,
      ParentColumns,
      ChildrenColumns,
      ChildrenDataOne,
      ChildrenDataTwo,
      ChildrenDataThree,
      ChildrenDataFour,
    } from './Sourse'
    import './styles.less'
    
    export default function App() {
    
      const [data, setData] = useState(null)
    
      const expandedRowRender = (item) => {
        return (
    // 子表格
    <Table columns={ChildrenColumns} pagination={false} dataSource={data[item.Cid]} /> ) } const openClick = (status, item) => { if (!status) return if (item.Cid === 1) { setData({ ...data, [item.Cid]: ChildrenDataOne }) } if (item.Cid === 2) { setData({ ...data, [item.Cid]: ChildrenDataTwo }) } if (item.Cid === 3) { setData({ ...data, [item.Cid]: ChildrenDataThree }) } if (item.Cid === 4) { setData({ ...data, [item.Cid]: ChildrenDataFour }) } } return ( <div className="pages-app">
       // 父表格 <Table className="components-table-demo-nested" columns={ParentColumns} expandable={{ expandedRowRender }} // 渲染子表格的回调 dataSource={ParentData} onExpand={openClick} // 展开时触发的回调 /> </div> ) }
  • 相关阅读:
    隐马尔科夫模型
    计算复杂性理论——函数
    STM32硬件I2C调试
    FPGA简单图像处理
    STM32配置使用外部12MHz晶振
    STM32从模式接受数据
    STM32 I2C读写EEPROM(中断模式)
    STM32 I2C读写EEPROM(POLLING模式)
    STM32串口实验
    STM32使用TIM闪烁LED——PWM方式
  • 原文地址:https://www.cnblogs.com/fengxiana/p/13812598.html
Copyright © 2020-2023  润新知