封装方法实现表格合并

封装方法

const mergeTableRow = (config:any)=> {
    let data = config.data
    const {
      mergeColNames, // 需要合并的列
      firstMergeColNames, // 受影响的列
      firstMerge // 以哪列为基础进行合并(基准列)
    } = config
    if (!mergeColNames || mergeColNames.length === 0) {
      return data
    }
    mergeColNames.forEach((m:any) => {
      const mList:any = {}
      data = data.map((v:any, index:any) => {
        // 区分需要合并行的key值
        const rowVal = v[firstMerge] + '-' + v[m]
        // 需要合并行的第二行以及之后行会走if
        // m === firstMerge 判断需要合并的列是否是基准列,如果是则只满足前面的条件,如果不是则需满足前面+后面的条件
        if (mList[rowVal] && mList[rowVal].newIndex === index && (m === firstMerge ? true : data[index][firstMerge + '-span'].rowspan === 0)) {
          // 判断受影响的列是否是需要合并的列
          const flag = firstMergeColNames.filter((f:any) => {
            return f === m
          }).length !== 0
          // 判断需要合并的列是否是基准列
          const mcFlag = mergeColNames.filter((mc:any) => {
            return mc === firstMerge
          }).length === 0
          // 判断基准列只有一行的时候,直接赋值rowspan和colspan为1
          if ((mcFlag && flag) || (flag && data[index][firstMerge + '-span'] && data[index][firstMerge + '-span'].rowspan === 1)) {
            v[m + '-span'] = {
              rowspan: 1,
              colspan: 1
            }
          } else {
            // 判断基准列或其他需要合并列有多行时,第一行rowspan++
            data[mList[rowVal]['index']][m + '-span'].rowspan++
            // 需要合并行除了第一行之后其他行设置rowspan和colspan为0
            v[m + '-span'] = {
              rowspan: 0,
              colspan: 0
            }
            mList[rowVal]['num']++
            mList[rowVal]['newIndex']++
          }
        } else { // 需要合并列第一行走else
          mList[rowVal] = {
            num: 1,
            index: index,
            newIndex: index + 1
          }
          v[m + '-span'] = {
            rowspan: 1,
            colspan: 1
          }
        }
        return v
      })
    })
    return data
  }
  const objectSpanMethod = ({ row, column, rowIndex, columnIndex }:any)=> {
    const span = column['property'] + '-span'
    if(row[span]){
      return row[span]
    }
    
  }
  export { 
    mergeTableRow,
    objectSpanMethod 
}

页面使用


<script setup lang="ts">
import {mergeTableRow,objectSpanMethod} from '../../hook/mergeTableRow.ts'  //引入封装的方法
const tableData = ref([
  {
    date: '2016-05-03',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-02',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-04',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
])
const tableData1 =  ref(mergeTableRow({  //处理数据
            data: tableData.value,
            mergeColNames: ['name'], // 需要合并的列,默认合并列相同的数据
            firstMergeColNames: [], // 受影响的列
            firstMerge: 'name' // 以哪列为基础进行合并,一般为第一列
          }))
</script>

<template>
  <div class="app-container">
    <el-table :data="tableData" border style="width: 100%" :span-method='objectSpanMethod'>
    <el-table-column prop="name" label="Name" width="180" />
    <el-table-column prop="date" label="Date" width="180" />
    <el-table-column prop="address" label="Address" />
  </el-table>
  </div>
</template>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值