首页 > 其他分享 >element-plus el-table spanMethod 行合并通用方法 可实现数据的自动整理

element-plus el-table spanMethod 行合并通用方法 可实现数据的自动整理

时间:2024-06-14 10:46:05浏览次数:16  
标签:el rowspan return colspan element spanMethod let primaryKey row

import type { TableColumnCtx } from 'element-plus'
interface SpanMethodProps <T> {
    row: T & Record<string, any>
    column: TableColumnCtx<T>
    rowIndex: number
    columnIndex: number
}

/**
 * el-table 行合并方法
 * @param {object[]} list 数据集
 * @param {string[]} primaryKey 参考的数据属性,只要这几个数据属性相同,则合并
 * @param {string[]} mergeKey 要合并的字段,不填写则按照 primaryKey 的字段合并
 */
export const useElSpanMethod = <T extends object,K extends keyof T>(list:T[],primaryKey:K[],mergeKey?:K[]) => {
    //取出合法的key
    if(!list?.length || !primaryKey?.length){
        return ()=>{}
    }
    let item = list[0]
    let itemKeys = Object.keys(item)
    let pKey = primaryKey.filter(key=>itemKeys.includes(key.toString()))
    if(!pKey.length){
        return ()=>{}
    }
    if(!mergeKey?.length){
        mergeKey = pKey
    }
    //数据整理,按照primaryKey 按照先后 相同的值放到一起
    sortByKey(list,pKey)
    let firstRowspan = pKey[0].toString()+'rowspan'
    let firstColspan = pKey[0].toString()+'colspan'

    return ({ row,column,columnIndex,rowIndex }:SpanMethodProps<T>)=>{
        // console.log(row,column,columnIndex,rowIndex)
        //当前列的属性
        let { property } =column;
        //是否需要合并
        if(mergeKey!.includes(property as K)){
            //找它对应的合并的 rowspan colspan
            let rowspan = property+'rowspan'
            let colspan = property+'colspan'

            if(row[rowspan] && row[colspan]){
                return {
                    rowspan:row[rowspan],
                    colspan:row[colspan]
                }
            }else{
                return {
                    rowspan:row[firstRowspan],
                    colspan:row[firstColspan],
                }
            }

        }else {
            return {
                rowspan:1,
                colspan:1
            }
        }
    }
};

function sortByKey<T extends object,K extends keyof T>(list:T[],primaryKey:K[]):T[]{
    let temp:Record<string, T[]> = {};
    let prop = primaryKey[0]
    for(let i=0;i<list.length;i++){
        let item = list[i];
        let propValue = item[prop] as string
        if(!temp[propValue]){
            temp[propValue]=[]
        }
        temp[propValue].push(item)
    }
    let result:T[] = [];
    for(let n in temp){
        let length = temp[n].length;
        let arr = temp[n].map((item:Record<string, any>,index)=>{
            let rowspanCol = prop.toString()+'rowspan'
            let colspanCol = prop.toString()+'colspan'
            item[rowspanCol] = index === 0 ? length : 0
            item[colspanCol] = index === 0 ? 1 : 0

            return {
                ...item as T
            }
        })
        result.push(
            ...(primaryKey.length > 1 ? sortByKey(arr,primaryKey.slice(1)) : arr)
        )
    }
    return result
}

使用方法

引入

import { useElSpanMethod } from 'useElSpanMethod'

页面使用

<el-table :span-method="useElSpanMethod(data,['id'],['id','name'])" :data="data">
 </el-table>

这个使用的意思是 按照id值相同的合并,合并id、name列 上下合并成一行

不会使用的问我,一对一免费指导

标签:el,rowspan,return,colspan,element,spanMethod,let,primaryKey,row
From: https://www.cnblogs.com/igangzi/p/18247329

相关文章

  • 【开源样本库分享】Five-Billion-Pixels-ENVIFormat 五十亿像素高精度样本库分享
    很高兴给大家分享一个好消息,Five-Billion-Pixels-ENVIFormat五十亿像素开源样本库(ENVI格式)正式上线了!Five-Billion-Pixels样本库是一个为遥感、地理信息系统(GIS)和图像处理领域的研究和应用而精心打造的高质量样本库。为了让更多的人受益,我们决定制作并发布ENVI格式的五十亿像素......
  • FastAPI快速入门1 Hello World
    1HelloWorld1.1HelloWorldch01/main.pyfromfastapiimportFastAPI,APIRouter#1app=FastAPI(title="RecipeAPI",openapi_url="/openapi.json")#2api_router=APIRouter()#3@api_router.get("/",status_code......
  • OpenTelemetry 实践指南:历史、架构与基本概念
    背景之前陆续写过一些和OpenTelemetry相关的文章:实战:如何优雅的从Skywalking切换到OpenTelemetry实战:如何编写一个OpenTelemetryExtensions从一个JDK21+OpenTelemetry不兼容的问题讲起这些内容的前提是最好有一些OpenTelemetry的背景知识,看起来就不会那么枯燥,为......
  • HIT CSAPP 计算机系统大作业 程序人生-Hello’s P2P From Program to Process
    摘 要本文借助hello.c跌宕起伏的一生——P2P(FromProgramToProcess)、020(FromZero-0toZero-0)从源代码到可执行程序以及和计算机系统硬件的配合,从计算机系统的角度阐述从源代码到可执行程序的转变,以及在计算机系统当中作为众多进程中的一员的运行过程。源程序首先经......
  • delphi Image32 图片转换成SVG
    image32中有2种算法转换图像为svg,一种是按透明度计算找边缘,另一种是分析像素梯度找边缘,demo代码整理后如下:unituFrmImageToSVG;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.......
  • delphi Image32 SVG图形查看器
    DELPHI 中没有SVG显示组件,需要用到第三方组件,高版本可以使用skia(但必须带上skia.dll).最新版Image32修改了很多,SVGIconImageList 也因此换成了Image32做为基础库,安装了 SVGIconImageList 就可以不用再单独安装Image32了(基本上是绿色不用安装包,直接引用就行)。unituFrmSVGSh......
  • 使用乐观锁和CAS解决超卖(Overselling)
    今天我要和大家分享的是如何在Java中使用乐观锁和CAS(Compare-And-Swap)技术来解决超卖的问题。最近我在项目中实现了这个功能,觉得非常有意思,所以决定分享出来。希望对大家有所帮助!背景介绍秒杀活动通常在电商平台中很常见,我觉得实现这个功能的难点在于多线程避免超卖。为了应......
  • (半成品) Lesson 1+2 in Numerical methods for Navier-Stokes equations and phase-fie
    Lesson1+2inNumericalmethodsforNavier-Stokesequationsandphase-fieldmodels梯度流从自由能开始一个常见的自由能是这样定义的:\[E(\phi)=\int_{\Omega}\frac{1}{2}\left|\nabla\phi\right|^2+F(\phi)\,d\Omega\]其中,\(\nabla\)是梯度算子,\(\phi\)是标......
  • 白冠鸡算法改进的深度极限学习机DELM的分类
    白冠鸡算法改进的深度极限学习机DELM的分类文章目录白冠鸡算法改进的深度极限学习机DELM的分类1.ELM原理2.深度极限学习机(DELM)原理3.白冠鸡算法4.白冠鸡算法改进DELM5.实验结果6.参考文献7.Matlab代码1.ELM原理ELM基础原理请参考:https://blog.csdn.net/u011835903/......
  • 金枪鱼群算法改进的深度极限学习机DELM的分类
    金枪鱼群算法改进的深度极限学习机DELM的分类文章目录金枪鱼群算法改进的深度极限学习机DELM的分类1.ELM原理2.深度极限学习机(DELM)原理3.金枪鱼群算法4.金枪鱼群算法改进DELM5.实验结果6.参考文献7.Matlab代码1.ELM原理ELM基础原理请参考:https://blog.csdn.net/u01......