el-table 动态计算合并行

news2024/12/15 11:01:11

原始表格及代码

在这里插入图片描述

<el-table
  :data="tableData"
  class="myTable"
  header-row-class-name="tableHead"
>
  <el-table-column prop="date" label="日期"> </el-table-column>
  <el-table-column prop="name" label="姓名"> </el-table-column>
  <el-table-column prop="project" label="项目"> </el-table-column>
  <el-table-column prop="address" label="地址" min-width="200">
  </el-table-column>
</el-table>
// 模拟数据接口请求并排序
getDataMock() {
  for (var i = 0; i < 10; i++) {
    let randomDay = Math.floor(Math.random() * 5 + 1);
    this.tableData.push({
      date: "2024-12-" + randomDay,
      name: "王小虎" + i,
      project: "项目" + i,
      address: "上海市普陀区金沙江路 " + i + " 弄",
    });
  }
  this.tableData.sort((a, b) => {
    let time1 = new Date(a.date).getTime();
    let time2 = new Date(b.date).getTime();
    return time1 - time2;
  });
},
.myTable {
  width: 700px;
  margin: 0 auto;
  border-radius: 20px;
  .tableHead {
    .el-table__cell {
      background-color: #bee7c5;
      color: #264f30;
      border-bottom: none;
      &:first-child {
        background: #435f5b;
        color: #fff;
      }
    }
  }
  .el-table__body {
    .el-table__row {
      .el-table__cell {
        background: #f7f7f7;
        border-bottom: 1px solid #dcdcdc;
        &:first-child {
          background: #acb2d9;
          color: #32405b;
          font-weight: bold;
          border-bottom: 1px solid #32405b;
        }
      }
    }
  }
}

合并行

  • 需要动态计算表格数据的合并行数
  • 如图所示,需要得到如下的 rowspan
    在这里插入图片描述
  • 计算表格数据每行的 rowspan
// 动态计算合并行的索引
getTableDataSpan(arr) {
  let spanData = []; // 数据数组的 rowspan 集合
  // rowspan > 1,合并行
  // rowspan == 1,单独行,不参与合并
  // rowspan == 0,被合并的行
  let lastRowIndex = 0; // 记录索引
  arr.forEach((item, index) => {
    if (index == 0) {
      // 第一行,默认认为不参与合并,记录为 1
      spanData.push(1);
    } else {
      if (item.date == arr[index - 1].date) {
        // 当前行的 date 与上一行的 date 相同,即当前行 的 rowspan 需要被记为 0
        spanData.push(0);
        // 向前找上次记录的索引,即需要当前行合并过去的目标行,使目标行的 rowspan 值加一
        spanData[lastRowIndex] += 1;
      } else {
        // 当前行的 date 与上一行的 date 不相等,则当前行的 rowspan 记录为 1
        spanData.push(1);
        // 暂且记录一下 lastRowIndex
        // 如果下一行与当前行的 date 值相同,就会合并到当前行,否则会更新 lastRowIndex 的值,进行下次对比
        lastRowIndex = index;
      }
    }
  });
  return {
    spanData: spanData,
    lastRowIndex: lastRowIndex,
  };
},
  • 计算 span-method 属性
 <el-table
   :data="tableData"
   class="myTable"
   header-row-class-name="tableHead"
   :span-method="spanMethod"
 >
 ...
spanMethod({ row, column, rowIndex, columnIndex }) {
  if (columnIndex === 0) {
    // 只有第一列需要合并,所以限定为 columnIndex === 0
    // 获取当前行的 rowspan
    let rowspan = this.getTableDataSpan(this.tableData).spanData[rowIndex];
    let colspan = rowspan === 0 ? 0 : 1; // 被合并到其他行,需要为 colspan 赋值为 0,否则为 1
    return {
      rowspan: rowspan,
      colspan: colspan,
    };
  }
},

样式调整优化

  • 上述代码得到如下效果
  • 原因是被合并的行,删掉了首列,被赋予了 first-child 的样式

在这里插入图片描述

  • 调整样式,为首列元素动态赋予类名
<el-table
  :data="tableData"
  class="myTable"
  header-row-class-name="tableHead"
  :span-method="spanMethod"
  :cell-class-name="cellClassName"
>
...
cellClassName({ row, column, rowIndex, columnIndex }) {
 if (columnIndex === 0) {
    return "colorBox"; // 首列添加类名
  }
},
.el-table__body {
.el-table__row {
   .el-table__cell {
     background: #f7f7f7;
     border-bottom: 1px solid #dcdcdc;
     &.colorBox {
       background: #acb2d9;
       color: #32405b;
       font-weight: bold;
       border-bottom: 1px solid #32405b;
     }
   }
 }
}
  • 效果如图,会发现,动态赋予的 colorBox 类名,并没有被加到被合并的行的首列元素上
    在这里插入图片描述

完整代码段

<template>
  <div class="tableBox">
    <el-table
      :data="tableData"
      class="myTable"
      header-row-class-name="tableHead"
      :span-method="spanMethod"
      :cell-class-name="cellClassName"
    >
      <el-table-column prop="date" label="日期"> </el-table-column>
      <el-table-column prop="name" label="姓名"> </el-table-column>
      <el-table-column prop="project" label="项目"> </el-table-column>
      <el-table-column prop="address" label="地址" min-width="200">
      </el-table-column>
    </el-table>
  </div>
</template>
<script>
export default {
  name: "dataList",
  components: {},
  data() {
    return {
      tableData: [],
    };
  },
  mounted() {
    this.getDataMock();
  },
  methods: {
    getDataMock() {
      for (var i = 0; i < 10; i++) {
        let randomDay = Math.floor(Math.random() * 5 + 1);
        this.tableData.push({
          date: "2024-12-" + randomDay,
          name: "王小虎" + i,
          project: "项目" + i,
          address: "上海市普陀区金沙江路 " + i + " 弄",
        });
      }
      this.tableData.sort((a, b) => {
        let time1 = new Date(a.date).getTime();
        let time2 = new Date(b.date).getTime();
        return time1 - time2;
      });
    },
    cellClassName({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 0) {
        return "colorBox";
      }
    },
    spanMethod({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 0) {
        // 只有第一列需要合并,所以限定为 columnIndex === 0
        // 获取当前行的 rowspan
        let rowspan = this.getTableDataSpan(this.tableData).spanData[rowIndex];
        let colspan = rowspan === 0 ? 0 : 1; // 被合并到其他行,需要为 colspan 赋值为 0,否则为 1
        return {
          rowspan: rowspan,
          colspan: colspan,
        };
      }
    },
    // 动态计算合并行的索引
    getTableDataSpan(arr) {
      let spanData = []; // 数据数组的 rowspan 集合
      // rowspan > 1,合并行
      // rowspan == 1,单独行,不参与合并
      // rowspan == 0,被合并的行
      let lastRowIndex = 0; // 记录索引
      arr.forEach((item, index) => {
        if (index == 0) {
          // 第一行,默认认为不参与合并,记录为 1
          spanData.push(1);
        } else {
          if (item.date == arr[index - 1].date) {
            // 当前行的 date 与上一行的 date 相同,即当前行 的 rowspan 需要被记为 0
            spanData.push(0);
            // 向前找上次记录的索引,即需要当前行合并过去的目标行,使目标行的 rowspan 值加一
            spanData[lastRowIndex] += 1;
          } else {
            // 当前行的 date 与上一行的 date 不相等,则当前行的 rowspan 记录为 1
            spanData.push(1);
            // 暂且记录一下 lastRowIndex
            // 如果下一行与当前行的 date 值相同,就会合并到当前行,否则会更新 lastRowIndex 的值,进行下次对比
            lastRowIndex = index;
          }
        }
      });
      return {
        spanData: spanData,
        lastRowIndex: lastRowIndex,
      };
    },
  },
};
</script>
<style lang="less" scoped>
.tableBox {
  background: #fff;
  padding: 50px 0;
  /deep/ .myTable {
    width: 700px;
    margin: 0 auto;
    border-radius: 20px;
    .tableHead {
      .el-table__cell {
        background-color: #bee7c5;
        color: #264f30;
        border-bottom: none;
        &:first-child {
          background: #435f5b;
          color: #fff;
        }
      }
    }
    .el-table__body {
      .el-table__row {
        .el-table__cell {
          background: #f7f7f7;
          border-bottom: 1px solid #dcdcdc;
          &.colorBox {
            background: #acb2d9;
            color: #32405b;
            font-weight: bold;
            border-bottom: 1px solid #32405b;
          }
        }
      }
    }
  }
}
</style>

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

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

相关文章

【Tomcat】第二站:Tomcat通过反射机制运行项目

目录 前言 1. 动态资源&静态资源 1.1 为什么要区分&#xff1f; 1.2 静态资源 1.3 动态资源 1.4 如何判断 2. Tomcat优先动态 2.1 原因 3. Tomcat运行项目的流程 前言 我们在写项目时&#xff0c;在进行前后端交互时&#xff0c;都会创建一个servlet&#xff0c;然…

vue canvas 绘制选定区域 矩形框

客户那边文档相当的多&#xff0c;目前需要协助其将文档转为数据写入数据库&#xff0c;并与其他系统进行数据共享及建设&#xff0c;所以不得不搞一个识别的功能&#xff0c;用户上传PDF文档后&#xff0c;对于关键信息点进行识别入库&#xff01; 以下为核心代码&#xff0c…

[Pro Git#3] 远程仓库 | ssh key | .gitignore配置

目录 1. 分布式版本控制系统的概念 2. 实际使用中的“中央服务器” 3. 远程仓库的理解 4. 新建远程仓库 5. 克隆远程仓库 6. 设置SSH Key 实验 一、多用户协作与公钥管理 二、克隆后的本地与远程分支对应 三、向远程仓库推送 四、拉取远程仓库更新 五、配置Git忽略…

【Python网络爬虫笔记】11- Xpath精准定位元素

目录 一、Xpath 在 Python 网络爬虫中的作用&#xff08;一&#xff09;精准定位元素&#xff08;二&#xff09;应对动态网页&#xff08;三&#xff09;数据结构化提取 二、Xpath 的常用方法&#xff08;一&#xff09;节点选取&#xff08;二&#xff09;谓词筛选&#xff0…

Spark执行计划解析后是如何触发执行的?

在前一篇Spark SQL 执行计划解析源码分析中&#xff0c;笔者分析了Spark SQL 执行计划的解析&#xff0c;很多文章甚至Spark相关的书籍在讲完执行计划解析之后就开始进入讲解Stage切分和调度Task执行&#xff0c;每个概念之间没有强烈的关联&#xff0c;因此这中间总感觉少了点…

java抽奖系统登录下(四)

6.4 关于登录 最简单的登录&#xff1a; 1、web登录页填写登录信息&#xff0c;前端发送登录信息到后端&#xff1b; 2、后端接受登录信息&#xff0c;并校验。校验成功&#xff0c;返回成功结果。 这种登录会出现一个问题&#xff0c;用户1成功登录之后&#xff0c;获取到后台…

基于米尔全志T527开发板的OpenCV进行手势识别方案

本文将介绍基于米尔电子MYD-LT527开发板&#xff08;米尔基于全志T527开发板&#xff09;的OpenCV手势识别方案测试。 摘自优秀创作者-小火苗 米尔基于全志T527开发板 一、软件环境安装 1.安装OpenCV sudo apt-get install libopencv-dev python3-opencv 2.安装pip sudo apt…

【传感器技术】第6章 压电式传感器,压电材料,压电效应,电压放大器

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…

AI 智能体(AI Agent)到底什么原理?能干什么事情

智能体应用有哪些&#xff1f; 智能体在千行百业中有着广泛的应用&#xff0c;目前已经在 600 多个项目落地和探索&#xff0c;广泛应用于政府与公共事业、交通、工业、能源、金融、医疗、科研等行业。智能体是模拟人类智能的计算机系统&#xff0c;能自主感知环境、智能决策并…

力扣-图论-12【算法学习day.62】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

智慧政务数据中台建设及运营解决方案

数据中台&#xff1a;政府数字化转型的引擎 数据中台作为政府数字化转型的核心驱动力&#xff0c;起源于美军的作战体系&#xff0c;强调高效、灵活与强大。它不仅促进了政府决策的科学性&#xff0c;还推动了政府服务的精细化与智能化。 数据中台的应用场景&#xff1a;数字…

如何使mysql数据库ID从0开始编号——以BiCorpus为例

BiCorpus是北京语言大学韩林涛老师研制一款在线语料库网站&#xff0c;可以通过上传tmx文件&#xff0c;实现在线检索功能&#xff0c;程序在github上开源免费&#xff0c;深受广大网友的喜欢。 在使用过程中&#xff0c;我发现我上传的语言资产经历修改后&#xff0c;mysql的…

开启第二阶段---蓝桥杯

一、12.10--数据类型的范围及转化 今天是刚开始&#xff0c;一天一道题 对于这道题我想要记录的是Java中的整数默认是 int 类型&#xff0c;如果数值超出了 int 的范围&#xff0c;就会发生溢出错误。为了避免这个问题&#xff0c;可以将数字表示为 long 类型&#xff0c;方法…

使用 Database Tools 实现高效数据查询的十大 IntelliJ IDEA 快捷键

得益于 IntelliJ IDEA Ultimate 的 Database Tools&#xff08;数据库工具&#xff09;中的专用 SQL 查询控制台&#xff0c;您无需离开 IDE 即可轻松修改连接到您的 Java 应用程序的任何数据库中的数据&#xff0c;以及从这些数据库中提取数据。 查询控制台具有 SQL 语句特定的…

【蓝桥杯选拔赛真题93】Scratch青蛙过河 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析

目录 Scratch青蛙过河 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 Scr…

minio 分布式文件管理

一、minio 是什么&#xff1f; MinIO构建分布式文件系统&#xff0c;MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用&#xff0c;它兼容亚马逊 S3 云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数…

华为FreeBuds Pro 4丢了如何找回?(附查找功能使用方法)

华为FreeBuds Pro 4查找到底怎么用&#xff1f;华为FreeBuds Pro 4有星闪精确查找和离线查找&#xff0c;离线查找功能涵盖播放铃声、导航定位、星闪精确查找、上线通知、丢失模式、遗落提醒等。星闪精确查找是离线查找的子功能&#xff0c;当前仅华为FreeBuds Pro 4充电盒支持…

深度学习:基于MindSpore的极简风大模型微调

什么是PEFT&#xff1f;What is PEFT&#xff1f; PEFT(Parameter Efficient Fine-Tuning)是一系列让大规模预训练模型高效适应于新任务或新数据集的技术。 PEFT在保持大部分模型权重冻结&#xff0c;只修改或添加一小部份参数。这种方法极大得减少了计算量和存储开销&#x…

【一本通】最小圈

【一本通】最小圈 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 对于一张有向图&#xff0c;要你求图中最小圈的平均值最小是多少&#xff0c;即若一个圈经过k个节点&#xff0c;那么一个圈的平均值为圈上k条边权的和除以k&#xff0c;现要…

ansible自动化运维(四)jinjia2模板

Jinjia2模板 前面说到playbook组成的时候&#xff0c;有介绍到template模块&#xff0c;而template模块对模板文件进行渲染时&#xff0c;使用的就是jinja2模板引擎&#xff0c;jinja2本身就是基于python的模板引擎&#xff0c;所以下面先来了解一下jinjia2模板的一些用法 基…