Ant Design的Table合并单元格处理rowSpan

举例:将address相同的数据合并行

const result= [
  {
    key: '1',
    name: '胡彦斌1',
    age: 32,
    address: '西湖区湖底公园1号',
  },
  {
    key: '2',
    name: '胡彦祖2',
    age: 42,
    address: '西湖区湖底公园1号',
  },
    {
    key: '3',
    name: '胡彦祖2',
    age: 42,
    address: '西湖区湖底公园1号',
  },
    {
    key: '4',
    name: '胡彦祖6',
    age: 42,
    address: '西湖区湖底公园1号',
  },
    {
    key: '5',
    name: '胡彦祖5',
    age: 42,
    address: '西湖区湖底公园2号',
  },
    {
    key: '6',
    name: '胡彦祖4',
    age: 42,
    address: '西湖区湖底公园2号',
  },
];

!!!关键:处理数据,count

handleSpan(result) {
    result.forEach((ele) => {
    //给每行数据的count为1
      ele.count = 1;
      //项目中的代码,由于index无法作为table中的rowKey(没探究),所以写了个uuid,这个方法没放上来,自行百度
      ele.id = guid();
    });
    //关键==>遍历
    for (let i = 0; i < result.length; i++) {
      const element = result[i];
      for (let j = i + 1; j < result.length; j++) {
      //1、如果上一行与下一行address相等则合并(即将上一行的count+1,下一行的的count为0),count就是rowSpan的值
        if (element.address=== result[j].address) {
          element.count++;
          result[j].count = 0;
          //3、这里是因为遍历到最后一条,不能跳出去,所以我们要结束所有的遍历
          if(j==result.length-1){
            return result;
          }
        } else {
        //2、如果到了不相等的一行则跳出j的遍历
        //这里减1是因为i的循环会+1,
          i = j - 1;
          break;
        }
      }
    }
    return result;
  }

然后是渲染数据字段

 allRender = (text, row, index) => {
    const obj = {
      children: text,
      props: {}
    };
    obj.props.rowSpan = row.count;
    return obj;
  };
  const columns = [
      {
        title: '住址',
        dataIndex: 'address',
        key: 'address',
        render: (text, row, index) => {
          return this.allRender(text, row, index);
        }
      },
      {
        title: '姓名',
        dataIndex: 'name',
        key: 'name',

      },
      {
        title: '年龄',
        dataIndex: 'age',
        key: 'age',
      },
    ];
//将id作为key也是关键
<Table
        bordered
        dataSource={this.props.result}
        columns={columns}
        rowClassName={(record, index) => {
          let className = 'light-row';
          if (index % 2 === 1) className = 'table-color-dust';
          return className;
        }}
        rowKey="id"
        pagination={false}
      />

需要注意的是:合并单元格的数据排序是连续的,所以最好从sql里查出来就order by一下,效果如下图
在这里插入图片描述

在使用 Ant DesignTable 组件进行合并单元格操作后,会出现分页的问题。这是因为 Table 组件在合并单元格时,对于被合并的单元格只会显示一个单元格内容,但是在分页时,每一页都是按照原始的数据进行分页的,因此会出现某些行被分到不同的页的情况。 解决这个问题的方法是使用 `rowSpan` 和 `colSpan` 属性,而不是合并单元格。具体地,可以在需要合并的单元格上设置 `rowSpan` 或 `colSpan` 属性,这样单元格会占用多行或多列,但是在 Table 组件内仍然算作多个单元格。这样在分页时,每一页都会按照实际的单元格数进行分页,不会出现某些行被分到不同的页的情况。 示例代码如下: ```jsx <Table dataSource={dataSource} pagination={pagination} rowKey="id"> <Column title="Name" dataIndex="name" key="name" /> <Column title="Age" dataIndex="age" key="age" /> <Column title="Address" dataIndex="address" key="address" render={(text, record, index) => { if (index === 0) { return { children: text, props: { rowSpan: 2, // 合并两行单元格 }, }; } if (index === 1) { return null; // 第二行单元格被合并,不需要渲染 } return { children: text, }; }} /> </Table> ``` 在上面的代码中,第三列的单元格需要合并前两行,因此在 `render` 函数中判断行索引,对第一行渲染单元格内容,并设置 `rowSpan` 属性为 2,对第二行返回 `null`,表示该行单元格被合并,不需要渲染。对于其他行,直接渲染单元格内容。这样在分页时,每一页都会按照实际的单元格数进行分页,不会出现某些行被分到不同的页的情况。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值