element + table 行列合并

如图,实现通过判断数据,动态的合并列数据

复制代码
<template>
  <div class="merge-cell">
    <el-table
        :data="tableData"
        :span-method="objectSpanMethod"
        border
        style="width: 100%; margin-top: 20px"
    >
      <el-table-column prop="id" label="ID" width="180"/>
      <el-table-column prop="name" label="Name"/>
      <el-table-column prop="amount1" label="Amount 1"/>
      <el-table-column prop="amount2" label="Amount 2"/>
      <el-table-column prop="amount3" label="Amount 3"/>
    </el-table>
  </div>
</template>
<script setup lang="ts">
import type {TableColumnCtx} from 'element-plus';
interface User {
  id: string
  name: string
  amount1: string
  amount2: string
  amount3: number
}
interface SpanMethodProps {
  row: User
  column: TableColumnCtx<User>
  rowIndex: number
  columnIndex: number
}
const tableData: User[] = [
  {
    id: '12987122',
    name: 'Tom',
    amount1: '234',
    amount2: '3.2',
    amount3: 10,
  },
  {
    id: '12987122',
    name: 'Tom',
    amount1: '165',
    amount2: '4.43',
    amount3: 12,
  },
  {
    id: '12987124',
    name: 'Tom',
    amount1: '324',
    amount2: '1.9',
    amount3: 9,
  },
  {
    id: '12987125',
    name: 'Tom',
    amount1: '621',
    amount2: '2.2',
    amount3: 9,
  },
  {
    id: '12987126',
    name: 'Tom',
    amount1: '539',
    amount2: '4.1',
    amount3: 15,
  },
  {
    id: '129871212',
    name: 'Tom1',
    amount1: '539',
    amount2: '4.1',
    amount3: 151,
  },
  {
    id: '129871213',
    name: 'Tom2',
    amount1: '539',
    amount2: '4.1',
    amount3: 152,
  },
  {
    id: '129871213',
    name: 'Tom3',
    amount1: '539',
    amount2: '4.1',
    amount3: 152,
  }
]
const objectSpanMethod = ({
      row, // 行
      column, // 列
      rowIndex, // 行的下标
      columnIndex  // 列的下标
    }: SpanMethodProps) => {
  // 只判断第一列和第二列
  if (columnIndex === 0 || columnIndex === 1) {
    // 获取当前单元格的值
    const currentValue = (row as any)[column.property];

    // 获取上一行相同列的值
    const preRow: any = tableData[rowIndex - 1];
    const preValue = preRow ? preRow[column.property] : null;

    // 如果当前值和上一行的值相同,则将当前单元格隐藏
    if (currentValue === preValue) {
      return { rowspan: 0, colspan: 0 };
    } else {
      // 否则计算当前单元格应该跨越多少行
      let rowspan = 1;
      for (let i = rowIndex + 1; i < tableData.length; i++) {
        const nextRow: any = tableData[i];
        const nextValue = nextRow[column.property];
        if (nextValue === currentValue) {
          rowspan++;
        } else {
          break;
        }
      }
      return { rowspan, colspan: 1 };
    }
 }
}
</script>
相关推荐
zhengfei6112 分钟前
第2章 Agent 核心组件深度解析
前端·javascript·react.js
GuWen_yue14 分钟前
LeetCode 76 最小覆盖子串|JS 滑动窗口标准解法(逐行精讲)
javascript·算法·leetcode
万少1 小时前
产品原型不用从零画 -GPT 出图,Gemini 生成 HTML
前端·javascript·后端
ZC跨境爬虫2 小时前
跟着 MDN 学JavaScript day_9:字符串方法实战挑战与解题思路
开发语言·前端·javascript
hewins3 小时前
NestJS 从入门到精通
javascript
柒和远方3 小时前
LeetCode 452. 用最少数量的箭引爆气球 —— 区间贪心经典:排序 + 扫描一箭穿心
javascript·python·算法
小小龙学IT3 小时前
Drizzle ORM:TypeScript 生态中冉冉升起的数据库工具链引言
javascript·数据库·typescript
旺王雪饼 www4 小时前
localStorage 和 sessionStorage区别与联系
服务器·前端·javascript
এ慕ོ冬℘゜5 小时前
【双月日期范围选择器】博客(可直接交作业 / 上线)
前端·javascript·交互·jquery
VidDown5 小时前
VidDown 使用介绍:一个免费、本地化的在线工具集
javascript·编辑器·音视频·视频编解码·视频