一文搞定Vue + element ui中比较复杂的表格合并问题

在这里插入图片描述

Vue.js 关于表格合并篇

1. 需求说明

  • 后端返回了单独的3条数据,数据格式如下(简略版)。
  • 这三条数据中有相同的项,也有不同的。
[
	{
		userName: 'A',
		channlName: '渠道一',
		planNum: 10,
		rate: 0,
		channelId: 111,
		corpName: '主体三'
	},{
		userName: 'B',
		channlName: '渠道二',
		planNum: 20,
		rate: 45%,
		channelId: 222,
		corpName: '主体一'
	},
	{
		userName: 'B',
		channlName: '渠道二',
		planNum: 20,
		rate: 45%,
		channelId: 222,
		corpName: '主体二'
	}
]
  • 需要将同一个人及同一个渠道的数据合并在一起。
  • 合并维度:投放人,投放渠道,计划加人,实时完成率。
  • 并且需要前端算出总加人数,实际加人,以及完成率。
  • 效果图如下:
    在这里插入图片描述

2. 实现思路及代码

  • 首先要形成一个对象映射(需要合并的项)。
  • 根据投放人及投放渠道两个维度分类,则以这两项为键。
// 创建合并映射对象
this.temp = {}
// tableDataTf为后端拿到的数据源
this.tableDataTf.forEach((item, index) => {
	// 如果对象中没有此项,则添加此项 对象的键
   if (!this.temp[item.userName + item.channelId]) {
    // 把对应的值塞进去,并且以count进行计数(有几个)
	// start: 当前索引在不在合并范围之类(合并的起始位置)
    this.temp[item.userName + item.channelId] = { ...item, count: 1, start: index }
  } else {
  	// 这些值是需要前端进行累加处理的
    this.temp[item.userName + item.channelId].rate += item.rate;
    this.temp[item.userName + item.channelId].count++;
  }
  // 总真实加人数
  this.allRealityNumberTf += item.realityNumber * 1;
})
// 累加的数据也从temp对象里面来
for(let objKey in this.temp) {
	// 总目标加人数
    this.allDayTargetTf += this.temp[objKey].dayTarget * 1;
}
  • 模板代码
// template
<el-s-table
   :columns="columnsTf"
   :data="tableDataTf"
   :span-method="objectSpanMethod"
   border>
</el-s-table>
  • 这里 table 进行了一点封装,使用插件自带的 el-table 是一样的效果
  • objectSpanMethod 方法
objectSpanMethod({ row, column, rowIndex, columnIndex }){
  // 这里是需要合并的列
  if (columnIndex === 0 || columnIndex == 1 || columnIndex == 3 || columnIndex === 5) {
    // 如果当前行的下标 == 映射对象记录的开始位置,则开启合并
    if (rowIndex === this.temp[row.userName + row.channelId].start) {
      return {
        // 从start开始,合并count行
        rowspan: this.temp[row.userName + row.channelId].count,  
        // 需要合并的列数
        colspan: 1  
      }
    } else {
      // start + 1 到 start + count行,这些行归 0,不作显示(被合并的项)
      // 这些行在表格里面其实还在,只是不显示了
      return {
        rowspan: 0,
        colspan: 0
      }
    }
  }
},
  • 主要的难点是在上面那个映射对象 temp,这里比较简单的。

1. 希望本文能对大家有所帮助,如有错误,敬请指出
2. 原创不易,还请各位客官动动发财的小手支持一波(关注、评论、点赞、收藏)
3. 拜谢各位!后续将继续奉献优质好文
4. 如果存在疑问,可以私信我(文底有V)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

欧阳呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值