Vue el-table 多表格联合显示、合并单元格

news2024/11/26 13:29:16

原型图

在这里插入图片描述

分析

先看内容是三个表,每个表的合并单元格都有点不同。
按照原型图给的内容,第一个是两列,有行合并和列合并,还有表头行合并。
现根据图造出mock数据,然后再写对应的代码。

export const columnVarsData = {
    spanArr0: [
        {
            rowIndex: 3,
            columnIndex: 0,
            rowspan: 3,
            colspan: 1
        },
        {
            rowIndex: 0,
            columnIndex: 0,
            rowspan: 1,
            colspan: 2
        },
        {
            rowIndex: 1,
            columnIndex: 0,
            rowspan: 1,
            colspan: 2
        },
        {
            rowIndex: 2,
            columnIndex: 0,
            rowspan: 1,
            colspan: 2
        },
        {
            rowIndex: 6,
            columnIndex: 0,
            rowspan: 1,
            colspan: 2
        },
        {
            rowIndex: 7,
            columnIndex: 0,
            rowspan: 1,
            colspan: 2
        }
    ],
    spanArr1: [
        {
            rowIndex: 0,
            columnIndex: 0,
            rowspan: 1,
            colspan: 2
        },
        {
            rowIndex: 1,
            columnIndex: 0,
            rowspan: 1,
            colspan: 2
        },
        {
            rowIndex: 3,
            columnIndex: 0,
            rowspan: 1,
            colspan: 2
        },
        {
            rowIndex: 4,
            columnIndex: 0,
            rowspan: 1,
            colspan: 2
        }
    ],
    spanArr2: [
        {
            rowIndex: 0,
            columnIndex: 0,
            rowspan: 1,
            colspan: 2
        },
        {
            rowIndex: 1,
            columnIndex: 0,
            rowspan: 1,
            colspan: 2
        },
        {
            rowIndex: 2,
            columnIndex: 0,
            rowspan: 1,
            colspan: 2
        }
    ],
    tableData: [
        {
            title: '汽车',
            columnList: [
                {
                    appName: '汽车1',
                    excessive: '汽车1',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                },
                {
                    appName: '汽车2',
                    excessive: '汽车2',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                },
                {
                    appName: '汽车3',
                    excessive: '汽车3',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                },
                {
                    appName: '银行',
                    excessive: '中国银行',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                },
                {
                    appName: '银行',
                    excessive: '华夏银行',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                },
                {
                    appName: '银行',
                    excessive: '农业银行',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                },
                {
                    appName: '汽车中心',
                    excessive: '汽车中心',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                },
                {
                    appName: '汽车小计',
                    excessive: '汽车小计',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                }
            ],
            list: [
                {
                    label: '数据',
                    prop: 'appName'
                },
                {
                    label: '数据',
                    prop: 'excessive'
                },
                {
                    label: '昨天',
                    prop: 'yesterdayPendingReview'
                },
                {
                    label: '今天',
                    prop: 'newAddedToday'
                },
                {
                    label: '明天',
                    prop: 'currentAuditCirculation'
                },
                {
                    label: '后天',
                    prop: 'rejectionVolumeToday'
                },
                {
                    label: '大后天',
                    prop: 'remainingQuantityReview'
                }
            ]
        },
        {
            title: '卡车',
            columnList: [
                {
                    appName: '卡车1',
                    excessive: '卡车1',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                },
                {
                    appName: '卡车2',
                    excessive: '卡车2',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                },
                {
                    appName: '卡车3',
                    excessive: '卡车4',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                },
                {
                    appName: '小计',
                    excessive: '小计',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                },
                {
                    appName: '合计',
                    excessive: '合计',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                }
            ],
            list: [
                {
                    label: '数据',
                    prop: 'appName'
                },
                {
                    label: '数据',
                    prop: 'excessive'
                },
                {
                    label: '昨天',
                    prop: 'yesterdayPendingReview'
                },
                {
                    label: '今天',
                    prop: 'newAddedToday'
                },
                {
                    label: '明天',
                    prop: 'currentAuditCirculation'
                },
                {
                    label: '后天',
                    prop: 'rejectionVolumeToday'
                },
                {
                    label: '大后天',
                    prop: 'remainingQuantityReview'
                }
            ]
        },
        {
            title: '出租车',
            columnList: [
                {
                    appName: '出租车1',
                    excessive: '出租车1',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                },
                {
                    appName: '出租车2',
                    excessive: '出租车2',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                },
                {
                    appName: '出租车3',
                    excessive: '出租车3',
                    yesterdayPendingReview: 20,
                    newAddedToday: 30,
                    currentAuditCirculation: 40,
                    rejectionVolumeToday: 50,
                    remainingQuantityReview: 60
                }
            ],
            list: [
                {
                    label: '数据',
                    prop: 'appName'
                },
                {
                    label: '数据',
                    prop: 'excessive'
                },
                {
                    label: '昨天',
                    prop: 'yesterdayPendingReview'
                },
                {
                    label: '今天',
                    prop: 'newAddedToday'
                },
                {
                    label: '明天',
                    prop: 'currentAuditCirculation'
                },
                {
                    label: '后天',
                    prop: 'rejectionVolumeToday'
                },
                {
                    label: '大后天',
                    prop: 'remainingQuantityReview'
                }
            ]
        }
    ]
}

代码实现

<div v-for="(table, idx) in tableData">
                <el-table
                    size="medium"
                    :data="table.columnList"
                    v-tableFit
                    highlight-current-row
                    :stripe="false"
                    ref="table"
                    id="table"
                    v-if="!loading"
                    v-loading="loading"
                    :span-method="
                        param => {
                            return tableSpanMethod(param, idx)
                        }
                    "
                    :header-cell-style="handerMethod"
                    :row-class-name="tableRowClassName"
                >
                    <el-table-column
                        v-for="(column, columIndex) in table.list.slice(0, 2)"
                        :key="columIndex"
                        :prop="column.prop"
                        :label="column.label"
                        align="center"
                        :index="columIndex"
                        show-overflow-tooltip
                    >
                        <template slot-scope="{ row, $index }">
                            <span>{{ row[column.prop] }}</span>
                        </template>
                    </el-table-column>
                    <el-table-column :label="table.title" align="center">
                        <el-table-column
                            v-for="(column, columIndex) in table.list.slice(2, 7)"
                            :key="columIndex"
                            :prop="column.prop"
                            :label="column.label"
                            align="center"
                            :index="columIndex"
                            show-overflow-tooltip
                        >
                            <template slot-scope="{ row, $index }">
                                <span>{{ row[column.prop] }}</span>
                            </template>
                        </el-table-column>
                    </el-table-column>
                </el-table>
            </div>
//导入mock数据
import * as dict from './index.js'
data() {
        return {
            loading: false,
            spanArr0: dict.columnVarsData.spanArr0,
            spanArr1: dict.columnVarsData.spanArr1,
            spanArr2: dict.columnVarsData.spanArr2,
            tableData: dict.columnVarsData.tableData
        }
    }

methods: {
	//隐藏表头
        handerMethod({ row, column, rowIndex, columnIndex }) {
            if (row[0].level == 1) {
                //这里有个非常坑的bug 必须是row[0]=0 row[1]=2才会生效
                row[0].colSpan = 0
                row[1].colSpan = 2
                if (columnIndex === 0) {
                    return { display: 'none' }
                }
            }
        },
        //单元格合并
        tableSpanMethod({ row, column, rowIndex, columnIndex }, idx) {
            const span = `spanArr${idx}`
            const spanArr = this[span]
            for (let i = 0; i < spanArr.length; i++) {
                //划分出需合并的每一个区域(spanArr[i])
                if (
                    columnIndex >= spanArr[i].columnIndex &&
                    columnIndex <= spanArr[i].columnIndex + spanArr[i].colspan - 1 &&
                    rowIndex >= spanArr[i].rowIndex &&
                    rowIndex <= spanArr[i].rowIndex + spanArr[i].rowspan - 1
                ) {
                    // 保留展示的单元格,合并单元格都为向右与向下延伸
                    if (
                        columnIndex === spanArr[i].columnIndex &&
                        rowIndex === spanArr[i].rowIndex
                    ) {
                        return {
                            rowspan: spanArr[i].rowspan,
                            colspan: spanArr[i].colspan
                        }
                    } else {
                        //删除冗余单元格
                        return {
                            rowspan: 0,
                            colspan: 0
                        }
                    }
                }
            }
        },
}

效果

在这里插入图片描述
--------------------------------------------------------- 手动分割线 -----------------------------------------------

目前spanArr0、spanArr1、spanArr2是写死的,如果后端返回的输入不固定的话,那个还要挨个去改,所以手动写个方法。可自行优化方法

data() {
        return {
            loading: false,
            spanArr0: [],
            spanArr1: [],
            spanArr2: [],
            tableData: dict.columnVarsData.tableData,
        }
    }
created() {
        this.spanArr0 = this.handleList(this.tableData[0].columnList)
        this.spanArr1 = this.handleList(this.tableData[1].columnList)
        this.spanArr2 = this.handleList(this.tableData[2].columnList)
},
methods: {
	//处理数据行列单元格
        handleList(list) {
            let name = ''
            let arr = []
            let ownidx = 0
            for (let i = 0; i < list.length; i++) {
                //如果这两个字段相同取出行坐标放在数组里
                if (list[i].appName == list[i].excessive) {
                    let rowObj = {
                        rowIndex: i,
                        columnIndex: 0,
                        rowspan: 1,
                        colspan: 2
                    }
                    arr.push(rowObj)
                } else {
                    list[i]['count'] = 0
                    name = list[i].appName
                    //如果数据不同看数组里appName相同的有几条数据
                    const arrList = this.countKeywords(list, name)
                    let idx = arrList.findIndex(item => item.appName === name)
                    ownidx = idx
                    let colObj = {
                        rowIndex: idx,
                        columnIndex: 0,
                        rowspan: arrList[idx]['count'],
                        colspan: 1
                    }
                    arr.push(colObj)
                }
            }
            arr = this.countIdxwords(arr, ownidx)

            return arr
        },
        //获取appName相同的数据
        countKeywords(array, appName) {
            for (let j = 0; j < array.length; j++) {
                let k = 'appName'
                if (array[j][k] != appName) array[j]['count'] = 1
                else array[j]['count'] += 1
            }
            return array
        },
        //最后处理数据,合并行
        countIdxwords(arr, idx) {
            //  第一步,去重
            var hash = []
            for (var i = 0; i < arr.length; i++) {
                for (var j = i + 1; j < arr.length; j++) {
                    if (arr[i].rowIndex === arr[j].rowIndex) {
                        ++i
                        j = i
                    }
                }
                arr[i].num = 0
                hash.push(arr[i])
            }
            // 第二步,统计重复个数
            hash.forEach(item => {
                arr.forEach(dd => {
                    if (item.rowIndex === dd.rowIndex) {
                        item.num++
                    }
                })
            })
            console.log(hash, '===>hash')
            return hash
        }
}

看一下改好的效果

没啥变化
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构day7(2023.7.21)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;折半查找/二分查找 1-------100 key8850---10075-100int arr[]{12,23,33,45,66,78,99};key7912,23,33,45,66,78,990 6low mid high66, 78, 99mid1 mid highlow99lowhigh…

进程间的通信之管道(匿名管道)

文章目录 进程间通信&#xff08;IPC&#xff09;管道管道特点为什么可以使用管道进行进程间通信管道数据结构匿名管道的使用 管道实例管道读写特点管道设置非阻塞 进程间通信&#xff08;IPC&#xff09; inter process conmmunication &#x1f447;&#x1f447;&#x1f…

现场总线协议转换网关快速选型介绍

现场总线协议是一种用于设备间通信的标准化接口&#xff0c;它支持数字信号和信息在不同设备之间的传输&#xff0c;例如传感器、执行器、控制器等。捷米特总线协议网关支持Profinet/DeviceNet/EthernetIP/EtherCAT/RS485/Profibus/ModbusRTU/TCPIP/CAN/CANopen/CC-Link等工业网…

【教学类-36-09】20230722职业抽卡(midjounery-niji)(涂色、裁剪、游戏)

作品展示&#xff1a; 随机选学具&#xff0c;辨认职业名称、说说工作内容、涂色、裁剪、交换卡片等 灵感来源&#xff1a; 最近在网上搜索“midjounery 简笔画”&#xff0c;发现一条宝藏“关键词”——可以直接生成简笔画风格&#xff08;造型的外边框线加粗&#xff09;的样…

【Elasticsearch】ES简单快速入门

ES简单快速入门 概述 Elasticsearch是一个分布式全文搜索引擎 下载与安装 https://www.elastic.co/cn/downloads/elasticsearch下载之后 解压文件夹&#xff0c;进入bin目录&#xff0c;双击elasticsearch.bat文件 一开始初始化时间比较久&#xff0c;之后初始化之后&…

Istio Pilot源码学习(一):Pilot-Discovery启动流程、ConfigController配置规则发现

本文基于Istio 1.18.0版本进行源码学习 1、Pilot-Discovery工作原理 Pilot-Discovery是Istio控制面的核心&#xff0c;负责服务网格中的流量管理以及控制面和数据面之间的配置下发 Pilot-Discovery从注册中心&#xff08;如Kubernetes&#xff09;获取服务信息并汇集&#xff…

新版UI盲盒抽奖系统源码-带H5端小程序端可打包APP_带安装教程

新版UI盲盒抽奖系统源码-带H5端小程序端可打包APP,这套盲盒系统小白看了一下里面没有搭建教程的&#xff0c;但是盲盒的搭建方式都是差不多的这套就放给你们自己研究了&#xff0c;UI还是很好看的感兴趣可以自己搭建看看。

Vue中TodoList案例_勾选

与上一篇Vue中TodoList案例_添加有三个文件变化了 App.vue&#xff1a;中加了checkTodo方法 <template><div id"root"><div class"todo-container"><div class"todo-wrap"><MyHeader :addTodo"addTodo"/&…

【Linux】信号保存信号处理

前言&#xff1a;对信号产生的思考 上一篇博客所说的信号产生&#xff0c;最终都要有OS来进行执行&#xff0c;为什么&#xff1f;OS是进程的管理者&#xff01;信号的处理是否是立即处理的&#xff1f;在合适的时候 -》那什么是合适的时候&#xff1f;信号如图不是被立即处理…

动态规划入门第3课,经典DP问题2 --- 背包问题

练习1 第1题 方案数 查看测评数据信息 给你n个整数&#xff0c;每个数可选或不选&#xff0c;要求选一些数&#xff0c;使它们的和为S&#xff0c;问有多少种方案&#xff1f; 输入格式 第一行&#xff1a;2个整数n和s&#xff0c;范围都在[1, 100]。 第二行&#xff1a;n个…

spring boot3 集成swagger3

快速开始 | Knife14j 官方的推荐 1. 设置pom.xml 主要是引入nexus-maven&#xff0c;com.github.xiaoymin 2个&#xff0c;cn.hutool&#xff0c;org.springframework <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://ma…

Linux超详细的了解

文章目录 前言Linux的简介不同应用领域的主流操作系统Linux系统历史Linux系统各版本 Linux的安装安装方式介绍安装Linux网卡设置安装SSH连接工具finalShell连接虚拟机Linux和Windows目录结构对比Linux目录介绍 Linux常用命令Linux命令初体验文件目录命令ls命令cd命令cat命令mor…

【Hammerstein模型的级联】快速估计构成一连串哈默斯坦模型的结构元素研究(Matlab代码实现)

&#x1f4a5;1 概述 在许多振动应用中&#xff0c;所研究的系统略微非线性。Hammerstein模型的级联可以方便地描述这样的系统。Hammerstein提供了一种基于指数正弦扫描相位属性的简单方法。 构成一连串Hammerstein模型的结构元素可以在快速估计中起到关键的作用。Hammerstei…

260. 只出现一次的数字 III

题目描述&#xff1a; 主要思路&#xff1a; 首先通过抑或的方式可以将所有两个的数字全部排除&#xff0c;得到两个单个数字的异或值。 接下来将当前得到的异或值取最低一位的1。 分析异或值的每一位&#xff0c;为1的肯定是两个数中一个有一个没有。于是可以通过这一特性将两…

(转载)PID神经元网络解耦控制算法(matlab实现)

​本博客的完整代码获取&#xff1a;https://www.mathworks.com/academia/books/book106283.html​ 1案例背景 1.1PID 神经元网络结构 PID神经元网络从结构上可以分为输人层、隐含层和输出层三层&#xff0c;n个控制量的PID神经元网络包含n个并列的相同子网络,各子网络间既相…

【车载开发系列】AUTOSAR DemComponent和DemDTC

【车载开发系列】AUTOSAR DemComponent和DemDTC 【车载开发系列】AUTOSAR DemComponent和DemDTC 【车载开发系列】AUTOSAR DemComponent和DemDTC一. DemComponent概念二. DemDTC概念三. 常用设置参数DemDTCClass1&#xff09; DemDTCFunctional2&#xff09;DemDTCSeverity3&am…

正点原子ubuntu虚拟机 使用QT虚拟键盘

目录 下载源码使用QT creator 编译移植库文件 http://t.csdn.cn/3QWOj https://blog.csdn.net/LuoLewin/article/details/124283314 本文参考这篇文章&#xff0c;使用正点原子的Ubuntu虚拟机&#xff0c;成功实现QT虚拟键盘&#xff0c;其中使用的方法做下记录&#xff0c;以免…

在Goland上配置GO环境

基本可以参照&#xff1a;https://segmentfault.com/a/1190000023710741 几点说明&#xff1a; 如果项目中有mod文件&#xff0c;然后提示&#xff1a;$GOPATH/go.mod exists but should not,可以如下操作&#xff1a; 设置进入到这个页面&#xff1a; 如何要安装一些包&…

数据结构--图的遍历 BFS

数据结构–图的遍历 BFS 树的广度优先遍历 从 1 结点进行 b f s bfs bfs的顺序&#xff1a; 【1】 【2】【3】【4】 【4】【6】【7】【8】 图的广度优先遍历 从 2 号点开始 b f s bfs bfs的顺序&#xff1a; 【2】 【1】【6】 【5】【3】【7】 【4】【8】 树 vs 图 不存在“回…

appium中toast识别

目录 一、什么是Toast&#xff1f; 二、环境前提 三、修改配置 四、安装驱动 五、常见报错及解决方案 1、cnpm 不识别&#xff0c;提示不是内部或外部命令 2、npm 也不识别 3、报错 六、代码节选 一、什么是Toast&#xff1f; Android中的Toast是一种简易的消息提示框…