当前位置: 首页 > news >正文

element基于表头返回 merge: true 配置列合并

<template><div class="wrap" v-loading="listLoading"><div class="content_wrap mt-10"><div style="text-align: center;"><h3>酿造交酒酒罐统计表({{month}}{{day}}日)</h3></div><div class="fr"><h4>单位:个</h4></div><el-table :data="dataList" style="width: 100%" border :span-method="objectSpanMethod"><!-- 遍历表头 --><template v-for="(column, index) in tableHeader"><el-table-columnv-if="column.children":label="column.propName"align="center"width="150px"><!-- 遍历二级表头 --><el-table-columnv-for="(childColumn, childIndex) in column.children":key="childIndex":label="childColumn.propName":prop="childColumn.prop"width="150px"align="center"></el-table-column></el-table-column><!-- 如果是一级表头(没有子表头) --><el-table-columnv-else:label="column.propName":prop="column.prop"align="center"width="150px"></el-table-column></template></el-table></div></div>
</template><script> 
import { mapGetters } from 'vuex'
import { Message } from 'element-ui'
import { stamnosstatistics } from "../../api/TasteandgradeApi";export default {name: 'Winecanstatistics',data() {return {tableHeader: [],dataList: [], tableColumnList: [],listLoading: false,month: '',day: '',spanMaps: {}, // 存储所有需要合并列的合并规则mergeColumns: [] // 存储所有需要合并的列prop}},mounted() {this.getdata()this.getTableData()},methods: {getdata() {const now = new Date();this.month = now.getMonth() + 1;this.day = now.getDate();},getTableData() {stamnosstatistics().then((response) => {this.dataList = response.data.result.dataListthis.tableHeader = response.data.result.columnList// 提取需要合并的列this.extractMergeColumns()// 计算合并规则this.calculateSpans()})},// 递归提取所有标记了merge:true的列extractMergeColumns() {this.mergeColumns = []const findMergeColumns = (columns) => {columns.forEach(column => {if (column.merge) {this.mergeColumns.push(column.prop)}if (column.children) {findMergeColumns(column.children)}})}findMergeColumns(this.tableHeader)},// 计算所有需要合并列的合并规则calculateSpans() {this.spanMaps = {}this.mergeColumns.forEach(prop => {const spanMap = new Map()let pos = 0// 初始化,所有行默认不合并(rowspan=1)for (let i = 0; i < this.dataList.length; i++) {spanMap.set(i, 1)}// 计算合并规则for (let i = 1; i < this.dataList.length; i++) {// 当前行与上一行值相同则合并if (this.dataList[i][prop] === this.dataList[i - 1][prop]) {spanMap.set(pos, spanMap.get(pos) + 1) // 合并行数+1spanMap.set(i, 0) // 当前行设置为0表示被合并} else {pos = i // 值不同,重置合并位置}}this.spanMaps[prop] = spanMap})},// Element表格合并单元格方法objectSpanMethod({ row, column, rowIndex, columnIndex }) {// 获取当前列的propconst currentProp = this.getColumnProp(columnIndex)// 如果当前列是需要合并的列if (currentProp && this.spanMaps[currentProp]) {const rowspan = this.spanMaps[currentProp].get(rowIndex)const colspan = rowspan > 0 ? 1 : 0return {rowspan,colspan}}},// 根据列索引获取列的propgetColumnProp(columnIndex) {let currentIndex = 0const findProp = (columns) => {for (const column of columns) {if (column.children) {const prop = findProp(column.children)if (prop) return prop} else {if (currentIndex === columnIndex) {return column.prop}currentIndex++}}return null}return findProp(this.tableHeader)}}
}
</script><style rel="stylesheet/scss" lang="scss">
</style>
[{propName: '分类',prop: 'category',merge: true // 此列需要合并},{propName: '春天酒',children: [{propName: '货场空罐',prop: 'chuntianjiu_inEmpty',merge: true // 此列需要合并},{propName: '货场满罐',prop: 'chuntianjiu_inFull'}]}
]

在这里插入图片描述

相关文章:

  • Mixup
  • LeetCode热题100--234.回文链表--简单
  • 院校机试刷题第二天:1479 01字符串、1701非素数个数
  • 部署GraphRAG配置Neo4j实现知识图谱可视化【踩坑经历】
  • 用git下载vcpkg时出现Connection was reset时的处理
  • Yolov8的详解与实战-深度学习目标检测
  • 在Spark搭建YARN
  • [:, :, 1]和[:, :, 0] 的区别; `prompt_vector` 和 `embedding_matrix`的作用
  • Pinecone 向量数据库的连接以及增删改查操作讲解
  • 51单片机——交通指示灯控制器设计
  • Tailwind CSS 实战教程:从入门到精通
  • (C语言)超市管理系统(测试2版)(指针)(数据结构)(清屏操作)
  • UI 原型设计:交互规则的三要素——重要性、原则与实践
  • 浅析 Golang 内存管理
  • K8S redis 部署
  • nvrtc环境依赖
  • 数据库常见故障排查
  • Java GUI开发全攻略:Swing、JavaFX与AWT
  • 深入理解SpringBoot中的SpringCache缓存技术
  • 2025年PMP 学习十二 第9章 项目资源管理
  • 人民日报:从“轻微免罚”看涉企执法方式转变
  • 以军向也门3个港口的居民发布撤离令
  • KPL“王朝”诞生背后:AG和联赛一起迈向成熟
  • 这个“超强致癌细菌”,宝宝感染率高达40%,预防却很简单
  • 北洋“修约外交”的台前幕后——民国条约研究会档案探研
  • 沙县小吃中东首店在沙特首都利雅得开业,首天营业额超5万元