vue table合并行 动态列名

news2024/12/26 21:12:46

需求:

1.合并行,相同数据合并

2,根据后端返回数据动态显示列名,

我这个业务需求是,每年增加一列,也就是列名不是固定的,后端返回数据每年会多一条数据,根据返回数据显示列名

 实现:

html

<el-table v-loading="loading" :data="dataList" :span-method="objectSpanMethod">
      <el-table-column label="序号" align="center" type="index" :index="indexMethod" />
      <el-table-column label="一级" align="center" prop="type1name"  :show-overflow-tooltip="true" width="130px"/>
      <el-table-column label="二级" align="center" prop="type2name" :show-overflow-tooltip="true"  width="130px"/>
      <el-table-column label="三级" align="center" prop="type3name" :show-overflow-tooltip="true"  width="250px"/>
      <el-table-column label="合计" align="center" prop="sums" :show-overflow-tooltip="true"/>
      <el-table-column label="年份" align="center" prop="" :show-overflow-tooltip="true">
         <el-table-column v-for="(item,index) in titleList" :key="index" :label="item.title" :prop="item.value" align="center" width="60px"/>
      </el-table-column>
</el-table>

js

<script>
import { listAnnualReporte } from "@/api/system/annualReport";

export default {
  name: "annualReport",
  data() {
    return {
      // 遮罩层
      loading: true,    
      // 总条数
      total: 0,
      // 表格数据
      dataList: [],
      titleList: [],

      spanArr: [], //用于存放每一行记录的合并数
      pos: null,
      spanArr1: [],
      pos1: null
    };
  },
  created() {
    this.getList();
  },
  methods: {
    /** 查询列表 */
    getList() {
      this.loading = true;
      listAnnualReporte(this.queryParams).then(response => {
        let list = response.rows;
        console.log("年度报告");
        console.log(list);
        let tlist = [];
        for (let i = 0; i < list.length; i++) {
          let title = "20";
          let obj = list[i];
          //后端返回年份数据是c23,c24,c25,要拼成2023,2024,2025这样的列名
          Object.keys(obj).forEach(key => {
            let titleObj = {};
            let t = key.slice(0, 1);
            let tn = key.slice(1, 3);
            if (t == "c") {
              titleObj.title = title + tn;
              titleObj.value = key;
              tlist.push(titleObj);
            }
            return;
          });
          break;
        }
        //给table赋值
        this.dataList = list;
        //给动态列名赋值
        this.titleList = tlist;
        //合并列数据
        this.getSpanArr(list);
        
        this.loading = false;
      });
    },
    /** 自定义编号 */
    indexMethod(index) {
      let pageNum = this.queryParams.pageNum - 1;
      if (pageNum !== -1 && pageNum !== 0) {
        return index + 1 + pageNum * this.queryParams.pageSize;
      } else {
        return index + 1;
      }
    },
    getSpanArr(data) {
      this.pos = 0;
      this.pos1 = 0;
      for (let i = 0; i < data.length; i++) {
        if (i === 0) {
          // 如果是第一条记录(即索引是0的时候),向数组中加入1
          this.spanArr.push(1);
          this.pos = 0;
          this.spanArr1.push(1);
          this.pos1 = 0;
        } else {
          
          if (data[i].type1 === data[i - 1].type1) {
            // 如果name相等就累加,并且push 0 (这里的判断视自己的判定依据改变)
            this.spanArr[this.pos] += 1;
            this.spanArr.push(0);
          } else {
            // 不相等push 1
            this.spanArr.push(1);
            this.pos = i;
          }
                
          if (data[i].type2 === data[i - 1].type2) {
            // 如果name相等就累加,并且push 0 (这里的判断视自己的判定依据改变)
            this.spanArr1[this.pos1] += 1;
            this.spanArr1.push(0);
          } else {
            // 不相等push 1
            this.spanArr1.push(1);
            this.pos1 = i;
          }
        }
      }
    },
    /** 合并行 */
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      // 用于设置要合并的列 0 表示第一列
      // 名称 跨行显示
      if ([1].includes(columnIndex)) {
        const cRow = this.spanArr[rowIndex];
        const cCol = cRow > 0 ? 1 : 0;
        return {
          rowspan: cRow, // 合并的行数
          colspan: cCol // 合并的列数,为0表示不显示
        };
      }
      if ([2].includes(columnIndex)) {
        const cRow = this.spanArr1[rowIndex];
        const cCol = cRow > 0 ? 1 : 0;
        return {
          rowspan: cRow, // 合并的行数
          colspan: cCol // 合并的列数,为0表示不显示
        };
      }
    },

  }
};
</script>

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

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

相关文章

联合索引为什么是最左匹配原则

首先索引在使用B树时&#xff0c;B树是一个排序的树&#xff0c;根据节点大小进行排序。 当使用联合索引时其结构如下如图&#xff1a; 此时如果我们要查找第二个字母为d的目标数据like ‘%d, 如果索引来查找&#xff0c;那么根节点的第二个a小于d所有从根节点向右子树查找&a…

《vue3实战》在created生命周期中运用slice()方法结合element plus组件实现电影评价系统的分页

目录 前言 电影评价系统的分页是什么&#xff1f;它具体的作用体现在哪些方面&#xff1f; 一、slice的含义、语法和作用以及created的作用 slice是什么&#xff1f;slice有什么语法&#xff1f;slice的作用体现在哪些方面&#xff1f; created生命周期的作用&#xff1a;…

工业制造提升生产效率,其实有个简单办法!

当谈及现代电力系统的运行与管理&#xff0c;配电柜监控无疑是一个至关重要的环节。配电柜作为电力分配与控制的核心节点&#xff0c;其稳定运行直接关系到整个电力系统的安全性和可靠性。 随着电力需求的不断增长以及能源网络的复杂性提升&#xff0c;传统的人工巡检和维护已经…

企业通过CRM怎样实现无纸化办公?

在传统的办公模式中&#xff0c;经常要使用大量的纸张来记录各种信息&#xff0c;比如合同、报表等。想象一下&#xff0c;如果文件柜被盗或者着火&#xff0c;重要数据会不会丢失&#xff1f;如果需要查看某份文件&#xff0c;能不能及时找到&#xff1f;如果答案是否定的&…

OrienterNet: visual localization in 2D public maps with neural matching 论文阅读

论文信息 题目&#xff1a;OrienterNet: visual localization in 2D public maps with neural matching 作者&#xff1a;Paul-Edouard Sarlin&#xff0c; Daniel DeTone 项目地址&#xff1a;github.com/facebookresearch/OrienterNet 来源&#xff1a;CVPR 时间&#xff1a…

探究与思考!城市燃气的安全管理问题有哪些?解决措施又有哪些?

文章来源&#xff1a;网络 关键词&#xff1a;智慧燃气、智慧燃气场站、城市燃气场站、设备设施数字化、数字孪生、工业互联网 针对城市燃气安全管理现状&#xff0c;如用户端安全隐患不断增多、燃气管道系统规划不科学、燃气安全监管制度不完善等&#xff0c;进行科学的分析&…

Python实现SSA智能麻雀搜索算法优化Catboost分类模型(CatBoostClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法&#xff0c;在2020年提出&a…

「2024」预备研究生mem-分析推理强化:排队列(上)

一、分析推理强化&#xff1a;排队列(上) 二、练习

华为云classroom赋能--Toolkit系列插件DevSecOps助力开发者提速

一、前言 DevOps的概念想必大家都不陌生&#xff0c;它是一组过程、方法与系统的统称&#xff0c;通过它可以对交付速率、协作效率、部署频率速率、质量、安全和可靠性等进行提升改善。相比传统的软件开发模式&#xff0c;它是一种工作方式和文化的转变&#xff0c;把开发者和…

git Update failed cannot lock ref

报错详情 解决方案 百度了很多方案&#xff0c;过滤出了有效方案 去该项目下的.git文件里找到报错文件&#xff0c;本例中即为&#xff1a;.git/refs/tags/pre-RELEASE-PRE-20230817-03 删除该文件&#xff0c;重新pull&#xff0c;pull成功问题解决

江南大学采购ZJ-3型精密D33测试仪四件套设备

江南大学采购ZJ-3型精密D33测试仪四件套设备 江南大学&#xff08;Jiangnan University&#xff09;&#xff0c;坐落于江苏省无锡市&#xff0c;是中华人民共和国教育部直属高校&#xff0c;由教育部、江苏省人民政府共建 &#xff0c;国家“双一流”建设高校&#xff0c; “…

爬虫用拨号好还是HTTP爬虫ip池好?

程序员小伙伴们&#xff0c;在进行爬虫时&#xff0c;你是否曾纠结于选择拨号还是代理&#xff1f;不要犯愁&#xff01;今天我将与你分享一些实用的择优技巧&#xff0c;帮助你在爬虫之路上实现更高效的提速&#xff01; 一、拨号和HTTP爬虫ip的优劣势分析 1、拨号 优势&…

mac苹果电脑怎么运行Windows软件?怎么安装Win虚拟机?

近年来&#xff0c;苹果电脑的用户群体不断扩大&#xff0c;许多用户对于苹果电脑是否可以运行Windows软件产生了疑问。苹果电脑和Windows操作系统有着明显的区别&#xff0c;是否能够在苹果电脑上运行Windows软件。下面我们就来看苹果电脑可以运行Windows软件吗&#xff0c;苹…

基于javaweb的线上办公系统/在线员工办公系统的设计与实现

摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括线上办公系统的网络应用&#xff0c;在外国线上办公系统已经是很普遍的方式&#xff0c;不过国内的线上办公可能还处于起步阶段。线上办公系统具有部门信息、职位信息、…

LInux之例行工作

目录 场景 单一执行例行任务 --- at&#xff08;一次性&#xff09; 安装 命令详解 语法格式 参数及作用 时间格式 案例 at命令执行过程分析 循环执行的例行性任务--crontab&#xff08;周期性&#xff09; crontd服务安装 linux 任务调度的工分类 crontab工作过程…

网银快捷支付接口怎么申请?

快速支付是一种方便的支付方式&#xff0c;允许用户在不重复输入卡号、密码等详细信息的情况下&#xff0c;使用预绑定的银行卡或支付账户进行快速支付。 在快速支付中&#xff0c;用户可以选择在商家网站、移动应用或支付平台上使用快速支付选项&#xff0c;并选择绑定的银行…

云上的甜蜜早安:腾讯云云函数助力PHP打造女友专属每日推送

用腾讯云的云函数做一个微信公众号早安&#xff0c;每天定时发送早安给你的女朋友&#xff01; 1.首先我们登录腾讯云&#xff0c;在搜索栏搜索云函数 2.进入云函数&#xff0c;点击立即体验 3.这里我们选择 按照步骤选择 php 4.再就是配置页面&#xff0c;这里我们只需要配…

ChatGPT对于留学生带来了哪些影响?留学生又应该如何使用?

悉尼大学的赶DUE高峰期来得总是那么早&#xff0c;才开学四周&#xff0c;图书馆就已经被赶DUE人占领地满满当当。 面对即将到来的大批量写作任务&#xff0c;不少同学们打起了ChatGPT的主意。 2022年11月&#xff0c;人工智能&#xff08;AI&#xff09;工具ChatGPT&#xff…