antdesgin-vue表格合并单元格,且序号根据合并单元格排序

先贴效果图

主要使用官方api提供的配置项

 customRender: (value, row) => {
                  const obj = {
                   children: row.Nosort,
                    attrs: {},
                  };
                  obj.attrs.rowSpan = row.rowSpan;
                  return obj;
                },

这里的  rowSpan字段是自己根据表格数据判断添加跨行字段,Nosort字段是用来表格序号排序的,因为合并单元格,两个单元格之间肯定有相同字段或者关联性字段,我们首先对原来的表格数据数组进行处理,将需要合并的表格对象数据进行合并形成一个新的数组,例如:

  // 对象数组去重
  function uniqueObjArr(arr, fieldName) {
    const result = [];
    const resultArr = [];
    arr.forEach((child) => {
      if (result.indexOf(child[fieldName]) === -1) {
        result.push(child[fieldName]);
        resultArr.push(child);
      }
    });
    return resultArr;
  };
  // 去重并合并到children
  function sortData(dataArr) {
    const orgArrRe = dataArr.map(item => ({ ruleName: item.ruleName }));
    const orgArr = this.uniqueObjArr(orgArrRe, 'ruleName');// 数组去重
    orgArr.forEach((childOne) => { // 去重reportName合并到children,得到一共有几个不同的reportName要合并
      childOne.children = [];
      dataArr.forEach((childTwo) => {
        if (childOne.ruleName === childTwo.ruleName) { // childOne是去重的,childTwo是没去重的
          childOne.children.push(childTwo);
        }
      });
    });
    orgArr.forEach((every) => {
      every.span = every.children ? every.children.length : 0;
    });
    return orgArr;
  };
  var arrs = [
    {
      ruleName: '一类',
      name: '张三',
      age: 16,
    },
    {
      ruleName: '一类',
      name: '李四',
      age: 15,
    },
    {
      ruleName: '二类',
      name: '张三',
      age: 16,
    }
  ];
  var newarr = sortData(arrs);
  console.log(newarr)
    // {
  //   ruleName: "一类", children: [
  //     { ruleName: "一类", name: "张三", age: 16 },
  //     { ruleName: "一类", name: "李四", age: 15 }
  //   ], span: 2
  // },
  // {
  //   ruleName: "二类", children: [
  //     { ruleName: "二类", name: "张三", age: 16 }
  //   ], span: 1
  // }

将一类的数组对象(对象字段值相同的对象)进行合并,得到一个包含children的二维数组,最后当antdesign-table组件绑定table数据时,再次绑定一个函数makeData

  <a-table
              rowKey="kid"
              size="middle"
              :loading="loading"
              :columns="columns"
              :data-source="makeData(itemList)"
              :scroll="{ y: 240 }"
              :pagination="false"
            ></a-table>

js:

 // 遍历子元素,并赋值纵向合并数rowSpan
    makeData(data) {
      const sortResult =this.sortData(data);// 该sortData函数在上面
      const dataSource = [];
      var Nosort = 0;
      sortResult.forEach((item) => {
        if (item.children) {
          item.children.forEach((itemOne, indexOne) => {
            const myObj = itemOne;
            myObj.rowSpan = indexOne === 0 ? item.span : 0;
            myObj.Nosort = myObj.rowSpan === 0 ? Nosort : ++Nosort;
            dataSource.push(myObj);
          });
        }
      });
      return dataSource;
    },

这里最后说一下,开发时遇到的问题,本来一开始只声明了一个rowspan字段用来跨行是足够的,但是后续产品说序号才发现,跨行对序号排列不友好,所以多声明了一个Nosort字段,用来序号排列展示 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

杀猪刀-墨林

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

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

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

打赏作者

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

抵扣说明:

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

余额充值