Element plus 动态合并单元格(行合并)

直接看代码

/**
 * @param {*} param = {
 * data:要合并的table数据
 * arg: 要合并的 字段名
 * superiors: arg基于哪个字段进行合并(可不传,不传基于arg自身进行合并)
 * }
 * @returns 
 */
//  获取当前字段合并单元格的list数据
const getCurSameFields = (data, arg, superiors) => {
  const sameFilesList = []
  let start
  let superiorsVal
  if (data?.length > 0) {
    data.forEach((item, index) => {
      if (index === 0) {
        sameFilesList.push(1);
        start = 0
        if (superiors) superiorsVal = data[index][superiors]
      }
      if (index > 0) {
        if (superiors && data[index][superiors] === superiorsVal || !superiors) {
          if (data[index][arg] === data[index - 1][arg]) {
            sameFilesList[start] += 1;
            sameFilesList[index] = 0
          } else {
            sameFilesList.push(1);
            start = index;
          }
        } else {
          superiorsVal = data[index][superiors]
          sameFilesList.push(1);
          start = index;
        }
      }
    })
  }
  return sameFilesList
}
// 传入需要合并的单元格数据,第一个参数是table传入的参数,第二个参数合并参数传数组
// eg:
// const arr = [
//     {
//         mergeColumn: 0, // 要合并的列(第几列,从0开始)
//         sameFieldsList: getCurSameFields(data, 'name') // 要合并的单元格字段名数组
//     },
//     {
//         mergeColumn: 1, // 要合并的列(第几列,从0开始)
//         sameFieldsList: getCurSameFields(data, 'age') // 要合并的单元格字段名数组
//     }
// ]
const useMergeCells = (tableObj, mergeObj) => {
    if (Array.isArray(mergeObj)) {

        for (let i = 0; i < mergeObj.length; i++) {
            if (tableObj.columnIndex === mergeObj[i].mergeColumn) {
                const _row = mergeObj[i].sameFieldsList[tableObj.rowIndex];
                const _col = _row > 0 ? 1 : 0;
                return {
                    rowspan: _row,
                    colspan: _col
                  }
            }
            
        }
    }
}

项目中使用

<template>
  <el-table :data="tableData" style="width: 100%" :span-method="objectSpanMethod">
    <el-table-column prop="date" label="Date" width="180" />
    <el-table-column prop="name" label="Name" width="180" />
    <el-table-column prop="address" label="Address" />
  </el-table>
</template>
<script setup>
// 获取table数据
const mergeList = ref([])
const getTableInfo = async() => {
  tableLoading.value = true
  try {
    const data = await  api()
    mergeList.value = [{
          mergeColumn: 0,
          sameFieldsList: getCurSameFields(data , 'date') // 合并第一列的date
        },
        {
          mergeColumn: 2,
          sameFieldsList: getCurSameFields(data, 'address', 'name') // 基于name合并第三列的address
        }
      ]
  } catch (error) {
    
  }
}

const objectSpanMethod = (obj) => {
  return useMergeCells(obj, mergeList.value)
}
</script>
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Element Plus是一套基于Vue.js 2.0的桌面端组件库,其中的table表格组件支持合并单元格。在Element Plus中,我们可以通过设置span-method属性来自定义合并单元格的方法。具体来说,我们需要在data中定义一个方法,该方法接收两个参数:row和column,分别表示当前单元格所在的和列。在该方法中,我们可以根据需要返回一个对象,该对象包含两个属性:rowspan和colspan,分别表示需要合并数和列数。例如,如果我们需要将第一列中相同的单元格合并,可以编写如下的span-method方法: ``` spanMethod({ row, column, rowIndex, columnIndex }) { if (columnIndex === 0) { let rowspan = 1; for (let i = rowIndex + 1; i < this.tableData.length; i++) { if (this.tableData[i][columnIndex] === this.tableData[rowIndex][columnIndex]) { rowspan++; } else { break; } } return { rowspan, colspan: 1 }; } } ``` 在上述代码中,我们首先判断当前单元格是否为第一列,如果是,则遍历该列下面的所有单元格,找到相同的单元格并计算需要合并数,最后返回一个包含rowspan和colspan属性的对象即可。 除了自定义span-method方法外,我们还可以通过设置column的属性来实现合并单元格。具体来说,我们可以在column中设置prop属性来指定需要合并的列,然后在需要合并的单元格中设置rowspan和colspan属性即可。例如,如果我们需要将第一列中相同的单元格合并,可以编写如下的column配置: ``` columns: [ { label: '入库编号', prop: 'batchNo', rowspan: ({ row, column, rowIndex, columnIndex }) => { if (columnIndex === 0) { let rowspan = 1; for (let i = rowIndex + 1; i < this.tableData.length; i++) { if (this.tableData[i][columnIndex] === this.tableData[rowIndex][columnIndex]) { rowspan++; } else { break; } } return rowspan; } } }, { label: '供应商', prop: 'supplierName', rowspan: ({ row, column, rowIndex, columnIndex }) => { if (columnIndex === 1) { let rowspan = 1; for (let i = rowIndex + 1; i < this.tableData.length; i++) { if (this.tableData[i][columnIndex] === this.tableData[rowIndex][columnIndex]) { rowspan++; } else { break; } } return rowspan; } } }, // 其他列的配置 ] ``` 在上述代码中,我们在column中设置了prop属性来指定需要合并的列,然后在需要合并的单元格中设置了rowspan属性来指定需要合并数。需要注意的是,rowspan属性可以是一个函数,该函数接收一个参数,该参数包含row、column、rowIndex和columnIndex四个属性,分别表示当前单元格所在的、列以及索引和列索引。在该函数中,我们可以根据需要返回需要合并数即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值