element table 表格 span-method 某一列进行相同合并 支持树结构表格

news2024/9/20 22:30:23

须知

这是 vue2 版本,不过理论上 vue3 也能参考使用

可以直接打开 codepen 查看代码

效果图

在这里插入图片描述

代码

打不开 codepen 或者codepen 失效,查看下面代码参考

<script src="//unpkg.com/vue@2/dist/vue.js"></script>
<script src="//unpkg.com/element-ui@2.15.14/lib/index.js"></script>
<div id="app">
  <template>
    <div>
      <el-button @click="logMergedRowCount">Log</el-button>
      <el-table row-key="id" @expand-change="expandChange" :data="tableData" :span-method="objectSpanMethod" border :tree-props="{children: 'children', hasChildren: 'hasChildren'}" style="width: 100%; margin-top: 20px">
        <el-table-column prop="name" label="姓名">
        </el-table-column>
        <el-table-column prop="id" label="ID" width="180">
        </el-table-column>
        <el-table-column prop="amount1" label="数值 1(元)">
        </el-table-column>
        <el-table-column prop="amount2" label="数值 2(元)">
        </el-table-column>
        <el-table-column prop="amount3" label="数值 3(元)">
        </el-table-column>
      </el-table>
    </div>
  </template>
</div>
@import url("//unpkg.com/element-ui@2.15.14/lib/theme-chalk/index.css");

var Main = {
  data() {
    return {
      tableData: [],
      spanMap: {}, // 每层的 id => {子级有几个, 祖宗是谁}

      expandRowKeys: {}
    };
  },
  computed: {
    parentMap() {
      const keys = Object.entries(this.expandRowKeys)
        .filter(([k, v]) => v)
        .map(([k]) => k);
      console.log("keys", keys);
      let result = {};
      for (const item of keys) {
        const expandRow = this.spanMap[item];
        if (result[expandRow.parentId]) {
          result[expandRow.parentId] += expandRow.childCount;
        } else {
          result[expandRow.parentId] = expandRow.childCount;
        }
      }
      return result;
    }
  },
  mounted() {
    let datalist = [
      {
        id: "1",
        name: "一级事件",
        amount1: "165",
        amount2: "4.43",
        amount3: 12,
        children: [
          {
            id: "2",
            name: "二级事件1",
            amount1: "165",
            amount2: "4.43",
            amount3: 12,
            children: [
              {
                id: "3",
                name: "三级事件1",
                amount1: "165",
                amount2: "4.43",
                amount3: 12
              },
              {
                id: "4",
                name: "三级事件2",
                amount1: "165",
                amount2: "4.43",
                amount3: 12
              }
            ]
          },
          {
            id: "5",
            name: "二级事件2",
            amount1: "165",
            amount2: "4.43",
            amount3: 12
          }
        ]
      },
      {
        id: "6",
        name: "一级事件2",
        amount1: "165",
        amount2: "4.43",
        amount3: 12
      },
      {
        id: "7",
        name: "二级事件1",
        amount1: "165",
        amount2: "4.43",
        amount3: 12,
        children: [
          {
            id: "8",
            name: "三级事件1",
            amount1: "165",
            amount2: "4.43",
            amount3: 12
          },
          {
            id: "9",
            name: "三级事件2",
            amount1: "165",
            amount2: "4.43",
            amount3: 12
          }
        ]
      },
      {
        id: "10",
        name: "三级事件1",
        amount1: "165",
        amount2: "4.43",
        amount3: 12
      },
      {
        id: "11",
        name: "三级事件2",
        amount1: "165",
        amount2: "4.43",
        amount3: 12
      }
    ];
    datalist = this.preprocessData(datalist);
    this.tableData = datalist;
  },
  methods: {
    /**
     * 处理行展开状态变化的事件。
     * @param {Object} row - 当前行的数据对象。
     * @param {boolean} expanded - 表示行是否被展开。
     */
    expandChange(row, expanded) {
      // 使用 Vue 的 $set 方法更新展开行的键值对,确保响应性
      this.$set(this.expandRowKeys, row.id, expanded);
    },

    /**
     * 打印合并行数的日志。
     */
    logMergedRowCount() {
      // 打印合并行数的映射,用于调试或检查合并状态
      console.log(this.mergedRowCount);
    },

    preprocessData(data, id = "") {
      return data.map((item) => {
        const newItem = { ...item };
        newItem.parentId = id; // 将当前路径作为 parentId 属性
        if (this.spanMap[item.id]) {
          this.spanMap[item.id].childCount = item.children?.length || 0;
        } else {
          this.spanMap[item.id] = {
            childCount: item.children?.length || 0,
            parentId: id || item.id
          };
        }
        if (item.children && item.children.length > 0) {
          newItem.children = this.preprocessData(item.children, id || item.id);
        }
        return newItem;
      });
    },
    //进行表格合并
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 1) {
        if (row.parentId) {
          return {
            rowspan: 0,
            colspan: 0
          };
        } else {
          console.log("row.id", this.parentMap[row.id]);
          return {
            rowspan: (this.parentMap[row.id] ?? 0) + 1,
            colspan: 1
          };
        }
      }
    }
  }
};
var Ctor = Vue.extend(Main);
new Ctor().$mount("#app");

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

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

相关文章

【加密社】比特币海量数据问题解决方案

加密社 比特币是无敌的存在&#xff0c;刚翻了一遍中本聪的论文&#xff08;其实以前看过一次&#xff0c;那时不明觉厉&#xff09;&#xff0c;发现咱们一直在考虑的问题&#xff0c;基本都能在其论文上找到解决方案了。。 现在出现的这些问题&#xff0c;完全是因为bitcoin…

GS-SLAM论文阅读笔记--GSFusion

介绍 GS-SLAM是最近比较新的方向&#xff0c;由于传统SLAM的研究变得很少&#xff0c;拥抱与新的技术结合的方法也许是个好主意。之前总结了大部分GS-SLAM的文章。但是这个方向在不断发展&#xff0c;而发展初期的很多论文值得参考。所以用博客记录一下比较新的论文阅读笔记。…

代码随想录算法训练营第七天|LeetCode 334.反转字符串、541反转字符串II、151反转字符串中的单词

一、LeetCode 334.反转字符串 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a;编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间&#xff0c;你必须原地修…

万字长文浅谈三高系统建设方法论和实践

1 概述 整个软件的发展历程是一部软件复杂性对抗史&#xff0c;软件的复杂性分为技术复杂性和业务复杂性&#xff0c;业务复杂性主要是建模和抽象设计&#xff0c;技术复杂性主要是三高&#xff08;高性能&#xff0c;高并发&#xff0c;高可用&#xff09;的应对&#xff0c;…

高中生护眼台灯哪个牌子好?五款性价比高的护眼台灯测评结果

现在市面上形形色色的打着“护眼”口号的台灯太多了&#xff0c;因为眼睛对于我们来说很重要&#xff0c;我们看到美丽的事物都因为有他&#xff0c;所以大家一听到护眼就会选择购买。很多商家为了赚钱&#xff0c;随便贴个标签就说护眼&#xff0c;其实一点用都没有。高中生护…

九源基因第二大客户是供应商:国内分销商减少250家,押注减肥药

《港湾商业观察》廖紫雯 日前&#xff0c;杭州九源基因工程股份有限公司&#xff08;以下简称&#xff1a;九源基因&#xff09;二闯港交所&#xff0c;保荐机构为华泰国际、中信证券。此前&#xff0c;公司曾于1月向港交所提交过上市申请&#xff0c;但后续未有相关进展。 招…

Vue Element Plus el-select 使用 filterable 搜索下 @blur 事件绑定失效

失效原因 使用 filterable 导致 blur 事件绑定在输入框上&#xff0c;而不是整个选择器上 当点击选项时&#xff0c;输入框失去焦点触发 blur 事件 而点击其她位置收起下拉款的时候&#xff0c;并不会触发输入款的 blur 事件 解决方案 使用 element 提供的 visible-change …

【嵌入式学习笔记】---- 时钟源时钟树 RCC

微观引入时钟源 在芯片内部&#xff0c;布满了各种逻辑电路&#xff0c;通过数字信号进行通信 假设芯片内部存在如下这种逻辑电路&#xff1a; ①状态&#xff1a;当A、B均输入1时&#xff0c;与门输出1&#xff0c;异或门输出0&#xff0c;故此时寄存器的值为0 ②状态&…

文件被误删?找回电脑删除的文件,这4招很好用

在日常使用电脑的过程中&#xff0c;不小心误删重要文件的情况时有发生&#xff0c;让人心急如焚。但别担心&#xff0c;只要掌握了一些实用的方法&#xff0c;你就有可能轻松找回那些看似已经消失的文件。今天&#xff0c;就为大家分享四招非常有效的找回电脑删除文件的方法&a…

Java笔试面试题AI答之正则表达式(2)

文章目录 7. 简述Java正则表达式零宽断言 &#xff1f;8. 简述Java正则表达式贪婪与懒惰 &#xff1f;贪婪匹配&#xff08;Greedy Matching&#xff09;懒惰匹配&#xff08;Lazy Matching&#xff09;区别与应用示例 9. 简述Java正则表达式POSIX 字符类&#xff08;仅 US-ASC…

docker安装prometheus、grafana监控SpringBoot

1. 概述 最新有一个需求&#xff0c; 需要安装一个监控软件&#xff0c;对SpringBoot程序进行监控&#xff0c; 包括机器上cpu, 内存&#xff0c;jvm以及一些日志的统计。 这里需要介绍两款软件&#xff1a; prometheus 和 grafana prometheus: 中文名称&#xff0c; 普罗米…

OpenCV 与 Matplotlib 的结合使用:探索有趣的图像处理与可视化功能

本文将讲述&#xff0c;将 OpenCV 与 Matplotlib 相结合&#xff0c;可以充分利用两者的优势&#xff0c;实现丰富多彩的图像处理和数据可视化功能。本文将介绍几种有趣且实用的结合应用&#xff0c;并通过示例代码展示具体实现方式。在今后的博客中会扩展下面的十个基础实现以…

宝贝甜梦秘籍!康姿百德柔压磁性枕豪华款守护成长每一夜

科学护航童年梦&#xff01;康姿百德豪华柔压磁性枕&#xff0c;给孩子五星级的睡眠享受 孩子的成长过程中&#xff0c;良好的睡眠环境至关重要。而康姿百德柔压磁性枕&#xff08;豪华款&#xff09;&#xff0c;凭借其独特的设计和材料&#xff0c;成为了孩子成长过程中不可…

乐凡三防平板高性能为稳定运行保驾护航

随着科技进步的浪潮&#xff0c;三防工业平板电脑在自动化生产、设备监控及数据收集等场景中日益彰显其关键作用。但在特定环境&#xff0c;比如户外探险、紧急救援或电力供应不稳定的场合&#xff0c;维持设备的持续运行成为了一大挑战。因此&#xff0c;开发一款配备可更换电…

运动耳机怎么选购?解密最值得购买的五大品牌!

​到了2024年&#xff0c;开放式耳机已经成为耳机界的大热门。它们的好处是&#xff0c;既能让你听得健康&#xff0c;戴着又舒服&#xff0c;还能一边听歌一边留意周围的声音&#xff0c;这对于喜欢户外活动的人来说&#xff0c;能提高安全意识&#xff0c;是个很好的优势。作…

GaussDB关键技术原理:高弹性(三)

书接上文GaussDB关键技术原理&#xff1a;高弹性&#xff08;二&#xff09;从优化器剪枝、执行器两方面对hashbucket进行了解读&#xff0c;本篇将从段页式技术方面继续介绍GaussDB高弹性技术。 3 段页式 3.1 段页式存储 根据前文的介绍&#xff0c;hashbucket需要对文…

数据库审计是什么?主要用在哪些场景呢?

数据库审计是什么&#xff1f;主要用在哪些场景呢&#xff1f; 数据库审计 数据库审计是指对数据库系统中的操作进行记录、监控和分析的过程&#xff0c;用于检查和评估数据库的安全性、合规性和完整性。数据库审计可以为组织提供重要的安全保障和合规性需求的满足。本文将介…

嵌入式24千兆电口+4万兆光口管理型三层交换机RTL9301模块

核心模块概述: 嵌入式RTL9301模块可以支持4口万兆上联24口千兆三层管理型以太网交换机&#xff0c;也就是最多可以提供24个10/100/1000自适应电口、4个10 Gb SFP 端口、1个console口、1个USB串口。 完善的安全控制策略及CPU保护策略(CPU protect policy)提高容错能力&#xff0…

LLM大模型学习:LLM常见问题(思维链部分)

1. 什么是思维链提示&#xff1f; 思维链(Chain-of-thought&#xff0c;CoT)&#xff0c;指的是一系列有逻辑关系的思考步骤&#xff0c;形成一个完整的思考过程。人在日常生活中&#xff0c;随时随地都会用思维链来解决问题&#xff0c;比如工作、读书经常用到的思维导图&…

【git】git安装方法

1 Git 的下载 这个就需要去 Git 官网下载对应系统的软件了&#xff0c;下载地址为 git-scm.com或者gitforwindows.org&#xff0c;或者阿里镜像&#xff08;感谢评论区的星悸迷航同学&#xff09; 上面的 git-scm 是 Git 的官方&#xff0c;里面有不同系统不同平台的安装包和…