elementPlus实现动态表格单元格合并span-method方法总结

最近在做PC端需求的时候,需要把首列中相邻的同名称单元格合并。
我看了一下elementPlus官网中的table表格,span-method可以实现单元格合并。

我们先看一下官网的例子:

合并行或列

多行或多列共用一个数据时,可以合并行或列。

通过给 table 传入span-method方法可以实现合并行或列, 方法的参数是一个对象,里面包含当前行 row、当前列 column、当前行号 rowIndex、当前列号 columnIndex 四个属性。 该函数可以返回一个包含两个元素的数组,第一个元素代表 rowspan,第二个元素代表 colspan。 也可以返回一个键名为 rowspan 和 colspan 的对象。
rowspan:合并几行
colspan:合并几列

<template>
  <div>
    <el-table
      :data="tableData"
      :span-method="arraySpanMethod"
      border
      style="width: 100%"
    >
      <el-table-column prop="id" label="ID" width="180" />
      <el-table-column prop="name" label="Name" />
      <el-table-column prop="amount1" sortable label="Amount 1" />
      <el-table-column prop="amount2" sortable label="Amount 2" />
      <el-table-column prop="amount3" sortable label="Amount 3" />
    </el-table>

    <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 lang="ts" setup>
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 arraySpanMethod = ({
  row,
  column,
  rowIndex,
  columnIndex,
}: SpanMethodProps) => {
  if (rowIndex % 2 === 0) {
    if (columnIndex === 0) {
      return [1, 2] // // 合并1行 合并2列
    } else if (columnIndex === 1) {
      return [0, 0]
    }
  }
}

const objectSpanMethod = ({
  row,
  column,
  rowIndex,
  columnIndex,
}: SpanMethodProps) => {
  if (columnIndex === 0) {
    if (rowIndex % 2 === 0) {  // 2、4、6、8......
      return {
        rowspan: 2, // 合并2行
        colspan: 1, // 合并1列
      }
    } else {
      return {
        rowspan: 0,
        colspan: 0,
      }
    }
  }
}

const tableData: User[] = [
  {
    id: '12987122',
    name: 'Tom',
    amount1: '234',
    amount2: '3.2',
    amount3: 10,
  },
  {
    id: '12987123',
    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: 17,
  },
  {
    id: '12987126',
    name: 'Tom',
    amount1: '539',
    amount2: '4.1',
    amount3: 15,
  },
]
</script>

效果如下:
在这里插入图片描述
好了,官网例子看过,来看看我在实际项目中是怎么应用的。
需要处理的数据如下:

let data = [
            {
                firstName: '基本证照',
                code: '001',
                secondName: '营业执照',
                sort: '30',
                fileList: [
                    {
                        id: '1',
                        name: '营业执照照片'
                    }
                ]
            },
            {
                firstName: '基本证照',
                code: '002',
                secondName: '身份证照',
                sort: '40',
                fileList: [
                    {
                        id: '2',
                        name: '身份证照照片'
                    }
                ]
            },
            {
                firstName: '现场照片',
                code: '003',
                secondName: '公司前台照',
                sort: '50',
                fileList: [
                    {
                        id: '3',
                        name: '公司前台照照片'
                    }
                ]
            },
            {
                firstName: '现场照片',
                code: '004',
                secondName: '公司工位照',
                sort: '60',
                fileList: [
                    {
                        id: '4',
                        name: '公司工位照照片'
                    }
                ]
            },
            {
                firstName: '经营证明',
                code: '005',
                secondName: '工厂生产照',
                sort: '70',
                fileList: [
                    {
                        id: '5',
                        name: '工厂生产照照片'
                    }
                ]
            }
        ]

需要展示的效果是:
首列中只有三行(基本证照、现场照片、经营证明)
也就是说 基本证照、现场照片这个两个首列需要合并两行

封装的函数如下,函数中都是注释,对函数中的定义和字段做了详细的说明。

        // 合并单元格规则(data为表格数据,cateName为合并字段的名称)这个函数的作用是对首列中的行进行合并
        function objSpanMethod({ row, column, rowIndex, columnIndex }, data, cateName) {
            // 非首列的数据都返回,不往下进行
            if (columnIndex !== 0) {
                return
            }
            let arrLength = [] // 存放secondName对应的数据数组长度
            let cateRows = [] // 存放起始合并行以及合并行数
            data.reduce((preValue, curValue, index, array) => {
                if (index == 0 || preValue[cateName] != curValue[cateName]) {
                    arrLength.push(1)
                } else {
                    arrLength[arrLength - 1]++
                }
                return curValue
            }, data[0])

            // 获取存放起始合并行以及合并行数
            arrLength.reduce((pre, cur, index, value) => { // pre指的是上一次计算过后的prev + cur这个值
                cateRows.push({ rowIndex: prev, rowspan: cur }); // rowIndex指的是从第几行开始合并,rowspan指的是合并几行
                return prev + cur
            }, 0)

            let intRowSpan = 0;
            for (let i = 0; i < arrLength.length; i++) {
                if (cateRows[i].rowIndex == rowIndex) {
                    intRowSpan = cateRows[i].rowspan;
                    break;
                }
            }
            return {
                // 当渲染执行到某一行的首列时,或者执行到首列时,对其中的行进行渲染时,例如渲染到第四行时,发现rowspan为3时,
                // 那就是首列中从第四行开始合并,合并3行,四、五、六这三行合并为一行。
                rowspan: intRowSpan,
                colspan: intRowSpan == 0 ? 0 : 1  // 如果不合并行,就返回0,说白了就不合并
            }
        }

具体的使用请看以下完整的代码:

<template>
  <div class="table">
    <el-table
      :data="data"
      :span-method="(param) => objSpanMethod(param, data, 'firstName')"
    >
      <el-table-colum prop="firstName" label="资料分类" width="150" />
      <el-table-colum prop="secondName" label="资料名称" />
      <el-table-colum prop="fileList" label="已上传资料">
        <template #default="{ row }">
          <p v-for="(item,index)" in row.fileList :key="item?.name + index">
            <span>
              {{ item?.name }}
            </span>
          </p>
        </template>
      </el-table-colum>
    </el-table>
  </div>
</template>

<script setup>
// data是接口请求回来的数据
// 数据如下:
let data = [
  {
    firstName: "基本证照",
    code: "001",
    secondName: "营业执照",
    sort: "30",
    fileList: [
      {
        id: "1",
        name: "营业执照照片",
      },
    ],
  },
  {
    firstName: "基本证照",
    code: "002",
    secondName: "身份证照",
    sort: "40",
    fileList: [
      {
        id: "2",
        name: "身份证照照片",
      },
    ],
  },
  {
    firstName: "现场照片",
    code: "003",
    secondName: "公司前台照",
    sort: "50",
    fileList: [
      {
        id: "3",
        name: "公司前台照照片",
      },
    ],
  },
  {
    firstName: "现场照片",
    code: "004",
    secondName: "公司工位照",
    sort: "60",
    fileList: [
      {
        id: "4",
        name: "公司工位照照片",
      },
    ],
  },
  {
    firstName: "经营证明",
    code: "005",
    secondName: "工厂生产照",
    sort: "70",
    fileList: [
      {
        id: "5",
        name: "工厂生产照照片",
      },
    ],
  },
];

// 合并单元格规则(data为表格数据,cateName为合并字段的名称)这个函数的作用是对首列中的行进行合并
function objSpanMethod({ row, column, rowIndex, columnIndex }, data, cateName) {
  // 非首列的数据都返回,不往下进行
  if (columnIndex !== 0) {
    return;
  }
  let arrLength = []; // 存放secondName对应的数据数组长度
  let cateRows = []; // 存放起始合并行以及合并行数
  data.reduce((preValue, curValue, index, array) => {
    if (index == 0 || preValue[cateName] != curValue[cateName]) {
      arrLength.push(1);
    } else {
      arrLength[arrLength - 1]++;
    }
    return curValue;
  }, data[0]);

  // 获取存放起始合并行以及合并行数
  arrLength.reduce((pre, cur, index, value) => {
    // pre指的是上一次计算过后的prev + cur这个值
    cateRows.push({ rowIndex: prev, rowspan: cur }); // rowIndex指的是从第几行开始合并,rowspan指的是合并几行
    return prev + cur;
  }, 0);

  let intRowSpan = 0;
  for (let i = 0; i < arrLength.length; i++) {
    if (cateRows[i].rowIndex == rowIndex) {
      intRowSpan = cateRows[i].rowspan;
      break;
    }
  }
  return {
    // 当渲染执行到某一行的首列时,或者执行到首列时,对其中的行进行渲染时,例如渲染到第四行时,发现rowspan为3时,
    // 那就是首列中从第四行开始合并,合并3行,四、五、六这三行合并为一行。
    rowspan: intRowSpan,
    colspan: intRowSpan == 0 ? 0 : 1, // 如果不合并行,就返回0,说白了就不合并
  };
}
</script>

<style>
</style>

这样就完全实现了首列中行的合并。总结这些呢,主要是记录下rowspan:合并几行
colspan:合并几列
这个规则,还是就是合并行中对于数据的处理。

好记性不如烂笔头,虽然当时明白的很好,但是还是总结记录下来最好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/375883.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

9.0 Zookeeper 节点特性

本章节介绍一下 zookeeper 的节点特性和简单使用场景&#xff0c;正是由于这些节点特性的存在使 zookeeper 开发出不同的场景应用。 1、同一级节点 key 名称是唯一的 实例&#xff1a; $ ls / $ create /runoob 2 已存在 /runoob 节点&#xff0c;再次创建会提示已经存在。 …

Mysql大表添加字段失败解决方案

背景 最近遇到一个问题&#xff0c;需要在user用户表千万级别数据中添加两个字段&#xff0c;发现老是加不上去&#xff0c;一直卡死。表数据量不仅大&#xff0c;而且是一个热点表&#xff0c;访问频率特别高&#xff0c;而且该表的访问是在一个大事务中。加字段的时候一直在…

Vue3大事件项目(ing)

文章目录 核心内容1.大事件项目介绍2.大事件项目创建3.Eslint配置代码风格4.配置代码检查工作流问题: pnpm lint是全量检查,耗时问题,历史问题 5.目录调整6.vue-router4 路由代码解析7.引入 Element Plus 组件库8.Pinia 构建仓库 和 持久化9.Pinia 仓库统一管理 核心内容 Vue3…

CX341A 安装驱动与刷固件

参考 驱动安装1 DPDK编译&#xff1a;支持Mellanox 25Gbps网卡 - 知乎 NVIDIA Mellanox CX网卡固件、驱动系列操作 - 知乎 驱动安装2 Mellanox网卡驱动安装指南 Mellanox OFED_崇尚匀速 追求极致的技术博客_51CTO博客 驱动与固件&#xff1a; 家用万兆网络指南 6 - 比…

3、生成式 AI 如何帮助您改进数据可视化图表

生成式 AI 如何帮助您改进数据可视化图表 使用生成式 AI 加速和增强数据可视化。 图像来源:DALLE 3 5 个关键要点: 数据可视化图表的基本结构使用 Python Altair 构建数据可视化图表使用 GitHub Copilot 加快图表生成速度使用 ChatGPT 为您的图表生成相关内容使用 DALL-E 将…

JCTC | 利用几何深度学习对蛋白质-配体结合pose进行等变灵活建模

Overview 该论文解决了药物开发中蛋白质-配体复合结构灵活建模的挑战。作者提出了一种名为FlexPose的新型深度学习框架&#xff0c;它可以直接对复杂结构进行建模&#xff0c;而不需要传统的采样和评分策略。 该模型结合了标量-向量双特征表示和 SE(3)等变网络设计来处理动态结…

[word] word表格内容自动编号 #经验分享#微信#其他

word表格内容自动编号 在表格中的内容怎么样自动编号&#xff1f;我们都知道Word表格和Excel表格有所不同&#xff0c;Excel表格可以轻松自动编号&#xff0c;那么在Word表格中如何自动编号呢&#xff1f; 1、选中内容后&#xff0c;点击段落-自动编号&#xff0c;选择其中一…

基于SSM的实习管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的实习管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

【MATLAB】使用梯度提升树在回归预测任务中进行特征选择(深度学习的数据集处理)

1.梯度提升树在神经网络的应用 使用梯度提升树进行特征选择的好处在于可以得到特征的重要性分数&#xff0c;从而识别出对目标变量预测最具影响力的特征。这有助于简化模型并提高其泛化能力&#xff0c;减少过拟合的风险&#xff0c;并且可以加快模型训练和推理速度。此外&…

首个商业化的可用于神经退行性疾病研究的即用型SMN ELISA试剂盒

首个商业化的可用于神经退行性疾病研究的即用型SMN ELISA试剂盒 运动神经元生存蛋白&#xff08;SMN&#xff09;是一种约38kDa的蛋白质&#xff0c;主要由位于5q染色体端粒部分的SMN1基因产生。几乎相同的着丝粒拷贝&#xff08;SMN2&#xff09;也产生少量的全长SMN蛋白&…

大规模机器学习简介

1. 非线性回归问题 1.1 问题描述 我们有一组实验数据&#xff0c;每个实验都给出了输入和输出对 (Xn, Yn)。每个输入 是空间中的一个点&#xff0c;每个输出 是 空间中的一个点。这些数据点被假设为独立同分布&#xff08;i.i.d&#xff09;。 我们的目标是找到一个函数 fw&…

即插即用、简单有效的大语言模型推荐算法!港大联合百度推出RLMRec

论文链接&#xff1a; https://arxiv.org/abs/2310.15950 论文代码&#xff1a; https://github.com/HKUDS/RLMRec 实验室主页&#xff1a; https://sites.google.com/view/chaoh/group-join-us?authuser0 TLDR 本文从互信息最大化的理论角度出发&#xff0c;通过引入文本信号…

微信小程序的图片色彩分析,窃取主色调,调色板

1、在微信小程序中创建包管理器 package.json npm init -y 2、安装 Mini App Color Thief 包 npm i --save miniapp-color-thief 3、构建 npm 4、wxml <canvas canvas-id"myCanvas"></canvas> <button bindtap"chooseImage">chooseIm…

构造函数

1.构造基本概念 1.是成员函数的一种&#xff0c;名字与类名相同&#xff0c;可以有参数&#xff0c;不能有返回值&#xff08;void也不行&#xff09; 作用是对对象进行初始化&#xff0c;如给成员变量赋初值 2.如果定义类是没写构造函数&#xff0c;则编译器生成一个默认的…

在 Docker 中启动 ROS2 里的 rivz2 和 rqt 出现错误的解决方法

1. 出现错误&#xff1a; 运行 ros2 run rivz2 rivz2 &#xff0c;报错如下 &#xff1a; No protocol specified qt.qpa.xcb: could not connect to display :1 qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was f…

debian12 - openssh-9.6.P1的编译安装

文章目录 debian12 - openssh-9.6.P1的编译安装概述笔记备注END debian12 - openssh-9.6.P1的编译安装 概述 在debian12上, 源码编译安装了openssl3.2 导致ssh失败. lostspeeddebian12d4x64:~$ openssl version OpenSSL 3.2.0 23 Nov 2023 (Library: OpenSSL 3.2.0 23 Nov 2…

金融信贷风控系统设计

前言 近一年多以来在金融行业负责风控系统&#xff0c;根据自己工作中的经验&#xff0c;写下这篇文章。既是对自己在风控领域工作的总结&#xff0c;也是给刚入行和准备入行的朋友打个样&#xff0c;希望能有所帮助。 为什么要有风控系统 记得 2016 年信贷行业的发展形势还…

计算机毕业设计 基于SpringBoot的城市垃圾分类管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

深入解析 Spring 事务机制

当构建复杂的企业级应用程序时&#xff0c;数据一致性和可靠性是至关重要的。Spring 框架提供了强大而灵活的事务管理机制&#xff0c;成为开发者处理事务的首选工具。本文将深入探讨 Spring 事务的使用和原理&#xff0c;为大家提供全面的了解和实际应用的指导。 本文概览 首…

​​​​​​​CleanMyMac X有什么优势?到底好不好用?

当你的Mac开始变得缓慢或者存储空间告急时&#xff0c;这通常是一个清理磁盘空间的信号。无论是工作文件、个人照片、还是各种应用程序&#xff0c;随着时间的推移&#xff0c;它们都可能在你的硬盘上积累了大量数据。有效地管理这些文件不仅可以提高你的工作效率&#xff0c;还…