Vue结合el-table实现合并单元格(以及高亮单元表头和指定行)

news2024/10/7 14:22:31

实现效果如下:

思路:
1.首先使用动态表头表格。
2.其次实现动态计算合并单元格。(计算规则 传递需要合并的字段)
3.然后封装公共的计算单元格方法 export导出供多个页面使用。
4.同时需要封装成公共的组件供多个页面使用。
5.组件内写指定表头行高亮颜色以及指定行高亮颜色方法。

封装公共计算单元格合并方法


/**
 * 合并相同数据,导出合并行所需的方法(只适合el-table)
 * @param {Array} dataArray el-table表数据源
 * @param {Array} mergeRowProp 合并行的列prop
 * @param {Array} sameRuleRowProp 相同合并规则行的列prop
 */
export function getSpanMethod(dataArray, mergeRowProp, sameRuleRowProp) {
  /**
     * 要合并行的数据
     */
  const rowspanNumObject = {}

  // 初始化 rowspanNumObject
  mergeRowProp.map(item => {
    rowspanNumObject[item] = new Array(dataArray.length).fill(1, 0, 1).fill(0, 1)
    rowspanNumObject[`${item}-index`] = 0
  })

  // 计算相关的合并信息
  for (let i = 1; i < dataArray.length; i++) {
    mergeRowProp.map(key => {
      const index = rowspanNumObject[`${key}-index`]
      if (dataArray[i][key] === dataArray[i - 1][key]) {
        rowspanNumObject[key][index]++
      } else {
        rowspanNumObject[`${key}-index`] = i
        rowspanNumObject[key][i] = 1
      }
    })
  }

  /**
     * 添加同规则合并行的数据
     */
  if (sameRuleRowProp !== undefined) {
    const k = Object.keys(rowspanNumObject).filter(key => {
      if (!key.includes('index')) {
        return key
      }
    })[0]
    for (const prop of sameRuleRowProp) {
      rowspanNumObject[prop] = rowspanNumObject[k]
      rowspanNumObject[`${prop}-index`] = rowspanNumObject[`${k}-index`]
      mergeRowProp.push(prop)
    }
  }

  /**
     * 导出合并方法
     */
  const spanMethod = function({ row, column, rowIndex, columnIndex }) {
    if (mergeRowProp.includes(column['property'])) {
      const rowspan = rowspanNumObject[column['property']][rowIndex]
      if (rowspan > 0) {
        return { rowspan: rowspan, colspan: 1 }
      }
      return { rowspan: 0, colspan: 0 }
    }
    return { rowspan: 1, colspan: 1 }
  }

  return spanMethod
}

简单使用代码案例


<template>
  <div class="container">
    <el-card>
      <el-button
        type="text"
      >vue2合并单元格多列或指定列<i
        class="el-icon-s-order"
      /></el-button>
      <el-table :data="tableData" :span-method="spanMethod" border>
        <el-table-column prop="title" label="测试合并单元格多列" align="center">
          <el-table-column
            prop="name"
            label="姓名"
            width="100"
            align="center"
          />
          <el-table-column
            prop="gradeName"
            label="成绩指标"
            width="100"
            align="center"
          />
          <el-table-column
            prop="unit"
            label="单位"
            width="100"
            align="center"
          />
          <el-table-column prop="weight" label="权重" align="center" />
          <el-table-column prop="amount1" label="数值 1(元)" align="center" />
          <el-table-column prop="amount2" label="数值 2(元)" align="center" />
        </el-table-column>
      </el-table>
    </el-card>
  </div>
</template>

<script>
import { getSpanMethod } from '@/utils/commonunit.js'
export default {
  name: 'Index',
  data() {
    return {
      tableData: []
    }
  },
  computed: {
    spanMethod() {
      return getSpanMethod(
        this.tableData,
        ['name'],
        ['gradeName', 'unit', 'weight']
      )
    }
  },
  created() {
    this.getPageList()
  },

  methods: {
    getPageList() {
      const getTableDatas = [
        {
          id: '1',
          name: '王小虎',
          gradeName: '指标库',
          unit: '单位',
          weight: '权重',
          amount1: '234',
          amount2: '165'
        },
        {
          id: '1',
          name: '王小虎',
          gradeName: '指标库',
          unit: '单位',
          weight: '权重',
          amount1: '234',
          amount2: '165'
        },
        {
          id: '1',
          name: '王小虎',
          gradeName: '指标库',
          unit: '单位',
          weight: '权重',
          amount1: '234',
          amount2: '165'
        },
        {
          id: '1',
          name: '王小虎',
          gradeName: '指标库',
          unit: '单位',
          weight: '权重',
          amount1: '234',
          amount2: '165'
        },
        {
          id: '1',
          name: '黎明',
          gradeName: '指标库',
          unit: '单位',
          weight: '权重',
          amount1: '234',
          amount2: '165'
        },
        {
          id: '1',
          name: '黎明',
          gradeName: '指标库',
          unit: '单位',
          weight: '权重',
          amount1: '234',
          amount2: '165'
        },
        {
          id: '1',
          name: '黎明',
          gradeName: '指标库',
          unit: '单位',
          weight: '权重',
          amount1: '234',
          amount2: '165'
        },
        {
          id: '1',
          name: '李红',
          gradeName: '指标库',
          unit: '单位',
          weight: '权重',
          amount1: '234',
          amount2: '165'
        },
        {
          id: '1',
          name: '李红',
          gradeName: '指标库',
          unit: '单位',
          weight: '权重',
          amount1: '234',
          amount2: '165'
        }
      ]
      this.tableData = getTableDatas
    }
  }
}
</script>

<style scoped lang="scss">
.container {
  width: 100%;
}
</style>

高亮指定表头行数据样式 高亮表头行样式 方法

 tableRowClassName({ row, rowIndex }) { // 高亮指定数据行
      if (row.valueAttributes === 'Y') {
        console.log(rowIndex)
        return 'warning-row'
      }
      return ''
    },
    headerRowCell(e) {
      if (e.column && e.column.property === 'title') { // 指定表头行样式
        return this.customHeaderCellStyle
      } else {
        return {}
      }
    }

下面是封装组件代码,详细可以私信我哈,看到必回!!!

vue3同理哈,都可以使用

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

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

相关文章

Hi3861 OpenHarmony嵌入式应用入门--鸿蒙开发环境搭建

目录 简介 准备材料 安装开发环境 配置开发工具和sdk 新建工程 代码编译 简介 本篇将进行hi3861开发环境的搭建&#xff0c;并能够编译默认工程。 准备材料 华为集成开发环境工具DevEco Device Tool 华为集成开发环境IDE DevEco Device Tool下载 | HarmonyOS设备开发 …

书生潽语趣味 demo

创建开发机 使用 InternLM2-Chat-1.8B 模型生成 300 字的小故事 运行猪八戒模型试一下

linux使用docker实现redis主从复制和哨兵模式

目录 1. 拉取redis镜像 2.使用可视化redis工具 3. 设置从redis 4.设置哨兵模式 5. 使用docker-compose快速创建 1. 拉取redis镜像 docker pull redis 默认拉取最新的镜像。 然后pull结束后使用docker images检查镜像&#xff1a; 然后docker run创建container容器 首先…

统计 | Levene检验

Levene检验是方差齐性检验的一种&#xff0c;即检验各组样本方差是否相等的一种统计方法.它通常用于方差分析&#xff08;ANOVA&#xff09;前的一个步骤。Levene检验的零假设是各组的方差相等。 Levene检验的数学步骤如下&#xff1a; 1. 数据准备&#xff1a; 假设我们有个…

Scikit-learn 快速入门篇

Sklearn 简介 scikit-learn (sklearn) 是 Python 中用于机器学习的最流行的库之一。它提供了一系列有效的算法和工具&#xff0c;涵盖各种机器学习任务&#xff0c;包括&#xff1a; 分类回归聚类降维模型选择数据预处理 Sklearn 六大模块 分类&#xff1a;预测离散类别 算…

腾讯云向量数据库-RAG介绍

1.说明 RAG结合LLM(通用大预言模型)构件基于私有文档、专业领域知识、实时信息的charbot。 2.RAG的主要步骤 知识切片成chunk向量化chunk入库query检索知识chunk构件prompts调用llm生成回答 3.优势 快速构件demo快速理解rag社区支持 4.痛点 投入大效果差调优难 5.RAG应…

激光slam论文汇总

文章目录 2014LOAM: Lidar Odometry and Mapping in Real-time 2018LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain 2020LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping 2021LVI-SAM: Tightly-co…

多 线 程

1&#xff0e;什么是多线程? 有了多线程&#xff0c;我们就可以让程序同时做多件事情 2.多线程的作用? 提高效率 3&#xff0e;多线程的应用场景? 只要你想让多个事情同时运行就需要用到多线程 比如:软件中的耗时操作、所有的聊天软件、所有的服务器 1.进程和线程【理解】 …

PHP01——php快速入门 之 使用phpstudy快速搭建PHP环境

PHP01——php快速入门 之 使用phpstudy快速搭建PHP环境 0. 前言1. 下载小皮面板1.1 下载phpstudy&#xff08;小皮面板&#xff09;1.2 启动、简单访问1.2.1 启动Apache1.2.2 访问1.2.3 访问自定义文件或页面 2. 创建网站2.1 创建网站2.2 可能遇到的问题2.2.1 hosts权限问题&am…

靠谱的香港服务器有哪些(看过才后悔)_避坑血泪史

最受欢迎的外贸建站服务器就是香港服务器&#xff0c;可是很多人还不知道如何辨别香港服务器商家是否靠谱。 小编曾经也是建站新手&#xff0c;以前也碰到过很多不靠谱的服务器商家&#xff0c;各种踩坑&#xff0c;可以说都是用钱堆出来的经验。在这里小编给大家总结下&#…

ADG数据库迁移方案

一、环境说明 源库 目标库 IP 192.168.37.201 192.168.37.202 系统版本 RedHat 7.9 RedHat 7.9 数据库版本 19.3.0.0.0 19.3.0.0.0 SID pri std hostname primary standby 数据量 整个库 说明:源库已经创建数据库实例&#xff0c;目标库只有数据库软件。…

蓝桥杯— —小明的背包问题

小明的背包问题 小明的背包1 — — &#xff08;01背包&#xff09; 友情链接&#xff1a;小明的背包1 题目&#xff1a; 输入样例: 5 20 1 6 2 5 3 8 5 15 3 3 输出样例&#xff1a; 37思路&#xff1a; 对于01背包问题&#xff0c;其中一个重要的条件是每一种物品只有一个…

git查看单独某一个文件的历史修改记录

git查看单独某一个文件的历史修改记录 git log -p 文件具体路径 注意&#xff0c;Windows下默认文件路径分隔符是 \&#xff0c;在git bash 里面需要改成 /。 git基于change代码修改与提交_git change-CSDN博客文章浏览阅读361次。git cherry-pick&#xff1a;复制多个提交comm…

2023全国青少年信息素养大赛总决赛C++小学组真题

2023 全国青少年信息素养大赛总决赛C小学组真题 第一题 给定一个五位数x&#xff0c;你需要重复做以下操作: 把数的各个数位进行由大到小排序和由小到大排序&#xff0c;得到的最大值和最小值&#xff0c;进行求差后作为新的x。 可以证明&#xff0c;在经过有限次操作后&…

代码随想录算法训练营33期 第三十一天(补29) | 491. 非递减子序列、46. 全排列、47. 全排列 II

491. 非递减子序列 class Solution { public:vector<int> path;vector<vector<int>> result;void BackTracking(vector<int>& nums, int index){if(path.size()>2){result.push_back(path);}unordered_set<int> usedSet;for (int iindex…

爬取日本常用汉字秘籍

前言 昨天投简历时遇到了这样的一个笔试。本以为会是数据结构算法之类的没想到直接发了一个word直接提需求&#xff0c;感觉挺有意思就写了这篇文章&#xff0c;感兴趣的朋友可以看看。 1. 网页内容解析 首先&#xff0c;我们通过请求网页获取到日本常用汉字的链接列表。然后…

多线程java

多线程的创建 前两种方法无法返回直接结果,而有的线程执行完毕后需要返回结果 方式一:java是通过java.lang.Thread类的对象来代表线程的 启动线程必须调用strat方法,不是调用run方法不要把主线程任务放在启动子线程之前 //1.让子类继承Thread线程类 public class MyThread …

逻辑卷和磁盘配额

文章目录 一、逻辑卷二、磁盘配额 一、逻辑卷 为什么会出现技术&#xff1f; 分区的缺点&#xff1a; 没有备份功能无法扩容性能取决于硬盘本身 相关概念 LVM 是 Logical Volume Manager 的简称&#xff0c;译为中文就是逻辑卷管理。它是 Linux 下对硬盘分区的一种管理机制。…

HarmonyOS开发学习:【DevEco Device Tool 安装配置(问题全解)】

本文介绍如何在Windows主机上安装DevEco Device Tool工具。 坑点总结&#xff1a; 国内部分网络环境下&#xff0c;安装npm包可能会很慢或者超时&#xff0c;推荐使用国内npm源&#xff08;如淘宝源、华为源等&#xff09;&#xff1b;serialport这个npm包安装的过程中需要编…

STC8H8K64U 库函数学习笔记 —— GPIO 点灯

STC8H8K64U 库函数学习笔记 —— GPIO 点灯 环境说明&#xff1a; 芯片&#xff1a;STC8H8K64U 软件&#xff1a; KeilC51 μVersion V5.38.00STCAI-ISP (V6.94) 不得不说&#xff0c;Keil 是我用过的 IDE 中&#xff0c;最让人头疼的事情&#xff0c;写代码就像是在记事本里编…