jeecgboot前端antd Table组件动态合并单元格

简单的表格:在这里插入图片描述
分类中相同的值合并效果如下:
在这里插入图片描述

静态数据合并单元格

实现

  1. 将要合并列的第一列(index 为 0) 的 rowSpan 设置为 2。index 为 1(第二列) 的 rowSpan 设置为 0。
  2. 将 index 为 2 (第三列)的 rowSpan 设置为 1(可以不用设置 rowSpan,默认为1)。
  3. 将 index 为 3 (第四列)的 rowSpan 设置为 3,后面列(5和6列)的 rowSpan 设置为 0。
const columns = [
    {
        title: '分类',
        dataIndex: 'category',
        render: (value, row, index) => {
	      const obj = {
	        children: value,
	        props: {},
	      };
	      if (index === 0) { // 第一列
	        obj.props.rowSpan = 2;
	      }
	      if (index === 1) {  // 第二列
	        obj.props.rowSpan = 0;
	      }
	      //没有相同项时可以不用设置 colSpan 
	      if (index === 2) {  // 第三列
	        obj.props.rowSpan = 1;
	      }
	      if (index === 3) {  // 第四列
	        obj.props.rowSpan = 3;
	      }
	      if (index === 4) {  // 第五列
	        obj.props.rowSpan = 0;
	      }
	      if (index === 5) {  // 第六列
	        obj.props.rowSpan = 0;
	      }
	      return obj;
      }   
    },
    {
        title: '名称',
        dataIndex: 'name',
    },
    {
        title: '评价',
        dataIndex: 'desc',
    },
];

const data = [
  {
      "category":"水果",
      "name": "桃子",  
      "desc": "好吃"
    },{
      "category":"水果",
      "name": "梨子",  
      "desc": "真好吃"
    },{
      "category":"蔬菜",
      "name": "茄子",  
      "desc": "真TM好吃"
    },{
    "category":"家禽",
     "name": "牛肉",  
      "desc": "太好吃了"
    },{
    "category":"家禽",
     "name": "羊肉",  
      "desc": "好吃到停不下来"
    },{
    "category":"家禽",
     "name": "猪肉",  
      "desc": "吃不起,太贵"
    }
]

总结:

  1. 设置合并列的第一列 rowSpan 为合并数。
  2. 设置其他相同项 rowSpan 为 0。

动态数据合并单元格

可以先把数据源处理好再直接渲染页面,处理这种业务逻辑最好的方式就是直接处理数据状态,用数据状态代替业务逻辑。

import dataJson from './data/Table.json';
let data = dataJson.data;
let field = 'category';
const  changeData = (data,field)=>{
    let count = 0;									// 重复项的第一项
    let indexCount = 1;								// 下一项
    while (indexCount<data.length){
        var item = data.slice(count,count+1)[0];	// 获取没有比较的第一个对象
        if(!item.rowSpan){
            item.rowSpan = 1;						// 初始化为1 合并单元格
        }
        if(item[field] === data[indexCount][field]){// 第一个对象与后面的对象相比,有相同项就累加,并且后面相同项设置为0
            item.rowSpan++;
            data[indexCount].rowSpan = 0;			// 其他为0 
        }else {
            count = indexCount;
        }
        indexCount++;
    }
}
changeData(data,field); 							// 处理数据

将每个相同项的第一项的 rowSpan 设置为合并数。并且其他的相同项设置为 0。数据格式如下:

data = [
  {
      "category":"水果",
      "name": "桃子",  
      "desc": "好吃",
      "rowSpan":2 
    },{
      "category":"水果",
      "name": "梨子",  
      "desc": "真好吃",
      "rowSpan":0 
    },{
      "category":"蔬菜",
      "name": "茄子",  
      "desc": "真TM好吃",
       "rowSpan":1
    },{
    "category":"家禽",
     "name": "牛肉",  
      "desc": "太好吃了",
       "rowSpan":3
    },{
    "category":"家禽",
     "name": "羊肉",  
      "desc": "真不错", 
      "rowSpan":0
    },{
    "category":"家禽",
     "name": "猪肉",  
      "desc": "吃不起,太贵", 
      "rowSpan":0
    }
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

讓丄帝愛伱

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

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

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

打赏作者

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

抵扣说明:

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

余额充值