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

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

须知

这是 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.kler.cn/news/294569.html

相关文章:

  • 数据结构基础之《(2)—对数器》
  • 海外直播对网速、带宽、安全的要求
  • Docker容器创建时,无法访问镜像源:Could not connect to archive.ubuntu.com:80
  • C语言操作符详解1(含进制转换,原反补码)
  • 消息队列 think-queue tp5.0
  • 使用Docker启动Redis容器并映射端口
  • ChatGPT3.5/4.0新手使用手册,国内中文版使用教程
  • 记录 vue-router 跳转到第一个有权限的菜单的实现方式
  • 【大模型开发】传统向量模型 vs 重排序模型:原理、实现与应用
  • 欺诈文本分类检测(十二):模型导出与部署
  • 八大排序原来也不过如此
  • 【软件逆向】第27课,软件逆向安全工程师之(二)寄存器寻址,每天5分钟学习逆向吧!
  • 【MIT 6.5840/6.824】In Search of an Understandable Consensus Algorithm 学习笔记
  • 如何使用useMemo来优化React组件的性能?
  • 7、关于LoFTR
  • 三维布尔运算对不规范几何数据的兼容处理
  • Linux 中常用的 Vim 命令大全
  • [OpenCV] 数字图像处理 C++ 学习——13Canny边缘检测 附完整代码
  • 828华为云征文 | Flexus X 实例服务器网络性能深度评测
  • 使用PowerShell导出Exchange邮箱大小
  • docker-network
  • GatewayWorker框架的详解和应用
  • [建模已更新]2024数学建模国赛高教社杯A题:“板凳龙” 闹元宵 思路代码文章助攻手把手保姆级
  • Hive整合MySQL
  • tabBar设置底部菜单选项以及iconfont图标
  • Java学习第七天
  • 【功能实现】如何实现点击后跳转到顶部??
  • 57-java csrf防御方案
  • 【Redis】Redis 集群搭建与管理: 原理、实现与操作
  • vue项目打包后,生成的index.html直接本地打开后没内容