前端开发必备技能知识笔记-Ant design for Vue的table的行合并的代码实现

Ant design for vue(后面简称antd)的表格是支持行/列合并,列合并比较简单好弄,直接看官网例子就能搞定,行合并官网例子也有,但是实际运用中还是要根据实际情况改造。下面我就记录一下根据项目需求参考官方例子写的实现行合并的代码,为了后面自己查看方便做这个笔记

实现原理

这个是官网中实现行合并的主要代码块

代码段主要实现原理就是将需要合并的那几行中的其中一行设置rowSpan为要合并的行数量,剩余的需要合并的那几行的rowSpan设置为0这里必须设置成0,不然表格会变形错位

步骤

1、数据分组,可以前端进行数据格式化将数据分组,如果后端已经分组那是最好的(行合并主要就是为了直观的展示分组后的数据)

2、在table的columns中设置行合并(我使用typescript,所以不用computed要这样用get写计算器,这里为什么要用计算器后面会解释)

//获去columns
get getColumns() {
    const jcxm_childrenColumns = (this.checkedNodes || []).map(({
                                                                  key,
                                                                  title,
                                                                }) => ({
      title,
      dataIndex: key,
      key,
      width: 100,
    }));
    if (jcxm_childrenColumns.length > 0) {
      return [{
        title: '区域',
        dataIndex: 'xzqmc',
        key: 'xzqmc',
        width: 100,
        fixed: 'left',
        customRender: (value, row, index) => {
          const { xzq } = row;
          // 满足要求需要合并的行中的第一行
          const temp_Index = this.dataSource.findIndex((record) => record.xzq === xzq);
          // 需要合并的行数
          const rowSpan = this.dataSource.filter((record) => record.xzq === xzq).length;
          if (rowSpan > 1) {
            // 要合并的行中的第一个(从这一行合并)
            if (temp_Index === index) {
              return {
                children: value,
                attrs: { rowSpan },
              };
            }
            // 其他要合并的行都设rowSpan=0
            return {
              children: value,
              attrs: { rowSpan: 0 },
            };
          }

          return value;
        },
      }, {
        title: '采样类型',
        dataIndex: 'cylxmc',
        key: 'cylxmc',
        width: 120,
        ellipsis: true,
        fixed: 'left',
      }, {
        title: '检测项目',
        children: jcxm_childrenColumns || [],
      }, {
        title: '综合',
        dataIndex: 'zh',
        key: 'zh',
        width: 100,
        fixed: 'right',
      }];
    }
    return [];
  }

主要实现代码

{
        title: '区域',
        dataIndex: 'xzqmc',
        key: 'xzqmc',
        width: 100,
        fixed: 'left',
        customRender: (value, row, index) => {
          const { xzq } = row;
          // 满足要求需要合并的行中的第一行
          const temp_Index = this.dataSource.findIndex((record) => record.xzq === xzq);
          // 需要合并的行数
          const rowSpan = this.dataSource.filter((record) => record.xzq === xzq).length;
          if (rowSpan > 1) {
            // 要合并的行中的第一个(从这一行合并)
            if (temp_Index === index) {
              return {
                children: value,
                attrs: { rowSpan },
              };
            }
            // 其他要合并的行都设rowSpan=0
            return {
              children: value,
              attrs: { rowSpan: 0 },
            };
          }

          return value;
        },
      }

注意:由于我的行合并实现代码中使用到了表的dataSource数据所以要在计算器computed中实现,不然达不到合并效果,因为初始化的时候dataSource没有数据,所以当dataSource被填充数据后要重新获取table的columns

效果


实现不是很难,只是做为一个笔记,方便后面查看

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花姐夫Jun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值