欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Ant Design Vue实现a-table表格单元格合并(列/行合并)

程序员文章站 2022-06-07 22:16:17
...

列合并

这里先写一个最简单的列合并实现:

这个合并的效果图只截了表格的一部分,左边是需要展示的数据。数据是后台返回的,但是最后的合计数据需要计算并合并展示。

Ant Design Vue实现a-table表格单元格合并(列/行合并)

实现代码如下:

表格数据:

<a-table bordered :columns="columns" :data-source="data" :pagination="false" :loading="loading" rowKey="id"></a-table>

这里的data为后台返回数据,合并的话需要重点查看columns 的数据,即表格表头。

具体实现,这里的columns数据在data内定义:

export default {
  data() {
    return {
      data: [],
      countnum: 0,
      columns: [
        {
	  title: '名称',
	  dataIndex: 'name',
	  key: 'name',
	},
	{
	  title: '数量',
          dataIndex: 'num',
	  key: 'num',
	},
        {
          title: '合计',
          dataIndex: 'count',
          key: 'count',
          customRender: (value, row, index) => {
            console.log(value, row, index);
            const obj = {
              children: this.countnum,
              attrs: {},
            };
            if(index === 0){   // 第一行数据开始,跨行合并的长度为数据data的长度
              obj.attrs.rowSpan = this.data.length;
            }
            if (index >= 1) {   // 从第一行往后的所有行表格均合并
              obj.attrs.rowSpan = 0;
            }
            return obj;
          }
        }
      ],
    }
  },
}

解析:

因为我所合并的只有合计这一列,所以这边只修改合计这一列的表头:

这个为官网的表格Api内的customRender,

Ant Design Vue实现a-table表格单元格合并(列/行合并)

这里对customRender后的数据console.log(value, row, index); 返回的结果:

Ant Design Vue实现a-table表格单元格合并(列/行合并)

这里的row可以拿到这一行所有的数据,这里value没有值,所有为undefined,后面的对象为row,打印的是这一行数据的所有值,最后打印出的是每行的索引,和A内的对应。

可以看到obj内的children为 this.countnum 这个为我存放的图内的11(计算得到的),也可以放其他的标签等元素。

这里使用rowSpan是列合并,这里将除了索引为0的一列设置之外,其他的不进行渲染,最后合并为一列。

Ant Design Vue实现a-table表格单元格合并(列/行合并)

if(index === 0){
  obj.attrs.rowSpan = this.data.length;
}
if (index >= 1) {
  obj.attrs.rowSpan = 0;
}

这个就是表格列的合并。

 

之前没做,刚好看一下行合并

行合并

如图:

Ant Design Vue实现a-table表格单元格合并(列/行合并)

这个是刚试的行合并:

可以这样操作,现在还会带着行合并的代码,所以就看差异部分即可:

const renderContent = (value, row, index) => {
  const obj = {
    children: value,
    attrs: {},
  };
  if (index >= 4) {
    obj.attrs.colSpan = 0;
  }
  return obj;
};

export default {
  data() {
    return {
      data: [],
      countnum: 0,
      columns: [
        {
            title: '名称',
	    dataIndex: 'name',
	    key: 'name',
	    customRender: (text, row, index) => {
            if (index < 4) {   // 前四行数据运行这个
              return <a href="javascript:;">{text}</a>;
            }
            return {   // 其他的
              children: <a href="javascript:;">{text}</a>,
              attrs: {
                colSpan: 2,  // 跨几列合并,这里现在是跨两列
              },
            };
          }
	},
	{
	    title: '数量',
	    dataIndex: 'num',
	    key: 'num',
	    customRender: renderContent,
	},
        {
          title: '合计',
          dataIndex: 'count',
          key: 'count',
          customRender: (value, row, index) => {
            const obj = {
              children: this.countnum,
              attrs: {},
            };
            if(index === 0){
              obj.attrs.rowSpan = this.data.length;
            }
            if (index >= 1) {
              obj.attrs.rowSpan = 0;
            }
            return obj;
          }
        }
      ],
    }
  },
}

下面这个是行合并的代码啦,已经试过啦,有效的!

注意:如果合并那一列就改哪里,列合并的值是下面的children(之前踩了,查了一会才发现)。

const obj = {
  children: this.countnum,
  attrs: {},
};

 

 

现在就是表格的列合并和行合并了,肯定还有遗漏的部分,欢迎补充指教!!!

相关标签: Ant Design Vue vue