关于el-table列的单元格合并

一、el-table里面的单元格合并

<el-table
      :data="tableData"
      :span-method="arraySpanMethod"
      border
      style="width: 100%"
></el-table>
const objectSpanMethod = ({  
  row,  
  column,  
  rowIndex,  
  columnIndex,
}: SpanMethodProps) => {
  if (columnIndex === 0) {
    const currentYear = row['targetYear'];  
    let rowspan = 1;
    if (rowIndex  === 0 || data.value[rowIndex]['targetYear'] !== currentYear) {
     for (let i = rowIndex + 1; i < data.value.length; i++) {  
        if (data.value[i]['targetYear'] === currentYear) {  
          rowspan++;  
        } else {  
          break;
        }  
      } 
      return {
        rowspan: rowspan,
        colspan: 1,
      }
    } else {
      return {
        rowspan: 0,
        colspan: 0,
      }
    }
  }else if(columnIndex === 1) {
    const currentType = row['targetType'];  
    let rowspan = 1;
    if(rowIndex  === 0 || data.value[rowIndex-1]['targetType'] !== currentType){
        for (let i = rowIndex + 1; i < data.value.length; i++) {  
        if (data.value[i]['targetType'] === currentType) {  
          rowspan++;  
        } else {  
          break;
        }  
      } 
      return {
        rowspan: rowspan,
        colspan: 1,
      }
    }else {
      return {
        rowspan: 0,
        colspan: 0,
      }
    }
  }else if(columnIndex >1 &&columnIndex<6 ){
    const currentDept = row['deptName'];  
    let rowspan = 1;
    if(rowIndex  === 0 || data.value[rowIndex-1]['deptName'] !== currentDept){
        for (let i = rowIndex + 1; i < data.value.length; i++) {  
        if (data.value[i]['deptName'] === currentDept) {  
          rowspan++;  
        } else {  
          break;
        }  
      } 
      return {
        rowspan: rowspan,
        colspan: 1,
      }
    }else {
      return {
        rowspan: 0,
        colspan: 0,
      }
    }
  }
};

二、效果

请添加图片描述

三、出现问题

上面代码出现问题,因为是按列合并的,第二列和第一列之间没有关系,导致第二列里面只有1,中间没有其他类型间隔的话,2023和2024的1,会合并在一起,没有因为属于不同的年份而进行分隔

优化代码

const objectSpanMethod = ({  
  row,  
  column,  
  rowIndex,  
  columnIndex,
}: SpanMethodProps) => {
//第一列合并
    if (columnIndex === 0) {
    let tableArr = [] //创建一个空数组,用于存储每一行的合并信息
    let pos = 0 //初始化一个位置变量,用于记录当前需要合并的行位置
    for (let i = 0; i < data.value.length; i++) {
      if (i === 0) {
        tableArr.push(1) // // 数组第一个元素为1,表示第一行至少有1个单元格
        pos = 0 // 设置当前位置为0
      } else {
        // 开始遍历 判断当前元素与上一个元素是否相同
        if (
          data.value[i].targetYear ===
          data.value[i - 1].targetYear
        ) {
          tableArr[pos] += 1 // 如果相同,则增加要合并的行数
          tableArr.push(0) // 在数组中添加一个0,表示当前行不显示单元格
        } else {
          tableArr.push(1) // 如果不同,则在新的一行开始,添加一个1
          pos = i  // 更新当前位置为当前行索引
        }
      }
    }
  }
这里只放了第一列的合并代码,其他列和第一列一样,只在内部的if判断里面进行区分
 // 开始遍历 判断当前元素与上一个元素是否相同
        if (
         data.value[i].targetYear ===
          data.value[i - 1].targetYear &&  
          data.value[i].itemType ===
          data.value[i - 1].itemType 
        )
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值