el-table :span-method合并单元格

news2024/11/23 21:45:50

2023.8.17今天我学习了如何使用el-table进行单元格的合并,效果如下:

 在开发的过程中,如果有多个重复的值,我们希望可以进行合并显示,这样就不会显得重复太多,el-table有自带的方法:

Element - The world's most popular Vue UI framework


它这边给出的实例已经是每一个数组都有对应的字段和值 

在给定的示例中,通过对 rowIndexcolumnIndex 进行判断,实现对表格单元格的动态合并。具体的逻辑如下:

  • 如果 rowIndex 是偶数(即偶数行),则进行以下判断:
    • 如果 columnIndex 是 0,则返回 [1, 2],表示当前单元格需要横向合并 1 行,纵向合并 2 列。
    • 如果 columnIndex 是 1,则返回 [0, 0],表示当前单元格不需要进行合并。

但是在开发过程中,我们遇到的数组可能是这样一对多关系的:

原始数据:

[
    {
        "id": 1,
        "sub_name": "学科一",
        "list": [
            {
                "id": 4,
                "ward_name": "病区一"
            },
            {
                "id": 5,
                "ward_name": "病区二"
            }
        ]
    },
    {
        "id": 2,
        "sub_name": "学科二",
        "list": [
            {
                "id": 6,
                "ward_name": "病区三"
            },
            {
                "id": 7,
                "ward_name": "病区四"
            },
            {
                "id": 8,
                "ward_name": "病区五"
            }
        ]
    },
    {
        "id": 3,
        "sub_name": "学科一",
        "list": [
            {
                "id": 9,
                "ward_name": "病区六"
            }
        ]
    }
]

通过elementUI的实例我们发现,每个数组里面都要有对应的字段,所以我们要把外面的字段放在里面:

一、forEach循环赋值

let new_demo = []
    demo.forEach(first_item => {//两层循环把外面的字段放在里面
      first_item.list.forEach(second_item => {
        second_item.sub_name = first_item.sub_name
      })
      new_demo.push(...first_item.list)
    })
    this.getFirstNameTableList(new_demo, 'sub_name')//合并方法,对应数据和参数名
    console.log(new_demo)

效果:

这样就可以实现每一个数组都有对应的字段,然后就可以使用合并的方法。

 二、合并方法(直接用,不需要改别的东西):

<template>
    <div>
      <el-table :span-method='objectSpanMethod'></el-table>
    </div>
</template>

<script>
export default{
  data(){
  return{
    spanFirstArr:[]
  }

 }


methods:{
   // 合并第一个重复的行名称
    getFirstNameTableList(data, params) {
      let arr = []
      let pos = 0
      this.spanFirstArr = []
      this.generalGeneralData(data, params).map(v => (arr = arr.concat(v)))
      arr.map(res => {
        data.shift()
        data.push(res)
      })
      const redata = arr.map(v => v[params])
      redata.reduce((old, cur, i) => {
        if (i === 0) {
          this.spanFirstArr.push(1)
          pos = 0
        } else {
          if (cur === old) {
            this.spanFirstArr[pos] += 1
            this.spanFirstArr.push(0)
          } else {
            this.spanFirstArr.push(1)
            pos = i
          }
        }
        return cur
      }, {})
    },
     // 重构新数据的方法
    generalGeneralData(data, params) {
      const groups = {}
      data.forEach(v => {
        const group = JSON.stringify(v[params])
        groups[group] = groups[group] || []
        groups[group].push(v)
      })
      return Object.values(groups)
    },
     objectSpanMethod({row, column, rowIndex, columnIndex}) {
      if (columnIndex === 0) {//第一列
        const _row = this.spanFirstArr[rowIndex]
        const _col = _row > 0 ? 1 : 0
        return {
          rowspan: _row,
          colspan: _col
        }
      }
    },

}

}

</script>

三:完整代码:

<template>
    <div>
       <el-table :data='typeList' :span-method='objectSpanMethod'>
         <el-table-column label='学科名称' prop='sub_name'/>
         <el-table-column label='病区名称' prop='ward_name'/>
       </el-table>
    </div>
</template>

<script>
export default{
  data(){
     return{
         spanFirstArr:[],
         typeList:[]
       }
 },
 created(){
  this.getList()
},
 methods:{
    getList(){
    let demo = [
    {
        "id": 1,
        "sub_name": "学科一",
        "list": [
            {
                "id": 4,
                "ward_name": "病区一"
            },
            {
                "id": 5,
                "ward_name": "病区二"
            }
        ]
    },
    {
        "id": 2,
        "sub_name": "学科二",
        "list": [
            {
                "id": 6,
                "ward_name": "病区三"
            },
            {
                "id": 7,
                "ward_name": "病区四"
            },
            {
                "id": 8,
                "ward_name": "病区五"
            }
        ]
    },
    {
        "id": 3,
        "sub_name": "学科一",
        "list": [
            {
                "id": 9,
                "ward_name": "病区六"
            }
        ]
    }
]

    let new_demo = []
    demo.forEach(first_item => {//两层循环把外面的字段放在里面
      first_item.list.forEach(second_item => {
        second_item.sub_name = first_item.sub_name
      })
      new_demo.push(...first_item.list)
    })
    this.typeList = new_demo
    this.getFirstNameTableList(this.typeList , 'sub_name')//合并方法,对应数据和参数名
   },
   // 合并第一个重复的行名称
    getFirstNameTableList(data, params) {
      let arr = []
      let pos = 0
      this.spanFirstArr = []
      this.generalGeneralData(data, params).map(v => (arr = arr.concat(v)))
      arr.map(res => {
        data.shift()
        data.push(res)
      })
      const redata = arr.map(v => v[params])
      redata.reduce((old, cur, i) => {
        if (i === 0) {
          this.spanFirstArr.push(1)
          pos = 0
        } else {
          if (cur === old) {
            this.spanFirstArr[pos] += 1
            this.spanFirstArr.push(0)
          } else {
            this.spanFirstArr.push(1)
            pos = i
          }
        }
        return cur
      }, {})
    },
     // 重构新数据的方法
    generalGeneralData(data, params) {
      const groups = {}
      data.forEach(v => {
        const group = JSON.stringify(v[params])
        groups[group] = groups[group] || []
        groups[group].push(v)
      })
      return Object.values(groups)
    },
     objectSpanMethod({row, column, rowIndex, columnIndex}) {
      if (columnIndex === 0) {//第一列
        const _row = this.spanFirstArr[rowIndex]
        const _col = _row > 0 ? 1 : 0
        return {
          rowspan: _row,
          colspan: _col
        }
      }
    },

}

}

</script>

扩展:

多个参数合并也可以通过同样的方式进行创建。

data(){
 return{
  spanSecondtArr:[]
  }
} 

 

 methods:{
  getList(){
   xxxxxx上面的和之前一样
   this.getFirstNameTableList(this.typeList , 'sub_name')//合并方法,对应数据和参数名
   this.getSecondNameTableList(this.typeList , 'ward_name')//合并方法,对应数据和参数名
  },

 // 合并第二个重复的行名称(写法和第一个一样,换一个存放数据就好)
    getSecondNameTableList(data, params) {
      let arr = []
      let pos = 0
      this.spanSecondtArr = []//换一个存放数据参数
      this.generalGeneralData(data, params).map(v => (arr = arr.concat(v)))//这个方法不变
      arr.map(res => {
        data.shift()
        data.push(res)
      })
      const redata = arr.map(v => v[params])
      redata.reduce((old, cur, i) => {
        if (i === 0) {
          this.spanSecondtArr .push(1)
          pos = 0
        } else {
          if (cur === old) {
            this.spanSecondtArr [pos] += 1
            this.spanSecondtArr .push(0)
          } else {
            this.spanSecondtArr .push(1)
            pos = i
          }
        }
        return cur
      }, {})
    },

    objectSpanMethod({row, column, rowIndex, columnIndex}) {
      if (columnIndex === 0) {//第一列
        const _row = this.spanFirstArr[rowIndex]
        const _col = _row > 0 ? 1 : 0
        return {
          rowspan: _row,
          colspan: _col
        }
      }
       if (columnIndex === 1) {//第二列
         const _row = this.spanSecondArr[rowIndex]
         const _col = _row > 0 ? 1 : 0
         return {
           rowspan: _row,
           colspan: _col
         }
       }
    },

  }

效果如下:

 

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

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

相关文章

安装编译器

安装MinGW&#xff0c;下载地址&#xff1a; MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net 下载x86_64-win32-seh&#xff0c;下载完解压到相应的路径下。

Leetcode-每日一题【剑指 Offer 32 - I. 从上到下打印二叉树】

题目 从上到下打印出二叉树的每个节点&#xff0c;同一层的节点按照从左到右的顺序打印。 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回&#xff1a; [3,9,20,15,7] 提示&#xff1a; 节点总数 < 1000 解题思路 1.题目要求我们从…

创建SpringBoot项目报错 - Process finished with exit code 1

错误信息 [ERROR] The build could not read 1 project -> [Help 1] [ERROR] [ERROR] The project com.example:ruoyi-excel-demo:0.0.1-SNAPSHOT (D:\Java\work\ruoyiExcelDemo\pom.xml) has 1 error [ERROR] Non-resolvable parent POM for com.example:ruoyi-e…

爬虫逆向实战(十六)--某建筑市场平台

一、数据接口分析 主页地址&#xff1a;某建筑市场平台 1、抓包 通过抓包可以发现数据接口是list 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 通过查看“响应”模块可以发现&#xff0c;返回的响应是…

【共同缔造 情暖襄阳】 暑期关爱未成年人志愿服务活动合集(三)

结合2023年襄阳市民政局“共同缔造 情暖襄阳”社会工作服务项目&#xff0c;在襄阳市民政局、襄州区民政局支持下&#xff0c;襄州社工协会联合肖湾街道育红社区开展暑期“希望家园”志愿服务活动&#xff0c;关爱未成年人。 8月4日&#xff0c;为培育孩子们广泛的兴趣爱好和动…

【JVM】垃圾回收算法

目录 一、判断对象已“死” 1.1、引用计数算法 1.2、可达性分析算法 1.3、引用的概念 二、垃圾收集算法理论 2.1、分代收集理论 三、垃圾收集算法 3.1、标记--清除算法 3.2、标记--复制算法 3.3、标记--整理算法 一、判断对象已“死” 在堆里面存放着Java世界中几乎所…

AGI 在网易云信的技术提效和业务创新

We believe our research will eventually lead to artificial general intelligence, a system that can solve human-level problems. Building safe and beneficial AGI is our mission. ---- OpenAI 通用人工智能 AGI 作为 AI 的终极形态&#xff0c;是 AI 行业内追求的演…

【制作npm包2】了解 package.json 相关配置

制作npm包目录 本文是系列文章&#xff0c; 作者一个橙子pro&#xff0c;本系列文章大纲如下。转载或者商业修改必须注明文章出处 一、申请npm账号、个人包和组织包区别 二、了解 package.json 相关配置 三、 了解 tsconfig.json 相关配置 四、 api-extractor 学习 五、npm包…

TECHnalysis Research:关于生成式AI的几个意外发现

TECHnalysis Research是一家美国的独立市场调查公司&#xff0c;该调查公司于2023年5月份对于全美10个行业的1000家企业IT决策负责人进行了调研&#xff0c;调研围绕生成式AI及其对于企业业务的影响。就在全球持续升温的生成式AI热度中&#xff0c;TECHnalysis Research的调研结…

第二章 搜索 No.2多源bfs,最小步数与双端队列广搜

文章目录 多源bfs&#xff1a;173. 矩阵距离最小步数&#xff1a;1107. 魔板双端队列bfs&#xff1a;175. 电路维修 根据Dijkstra的正确性可以验证bfs的正确性 多源bfs&#xff1a;173. 矩阵距离 173. 矩阵距离 - AcWing题库 输出01矩阵中的所有点到1的最短曼哈顿距离&#…

构建智能医疗未来:人工智能在线上问诊系统开发中的应用

随着人工智能技术的飞速发展&#xff0c;医疗领域也正在逐步迎来一场革命性的变革。其中&#xff0c;人工智能在在线上问诊系统开发中的应用&#xff0c;正为医疗产业带来全新的可能性。本文将深入探讨如何利用代码构建智能医疗未来&#xff0c;以提升线上问诊系统的效率、准确…

CSAPP Lab2:Bomb Lab

说明 6关卡&#xff0c;每个关卡需要输入一个字符串&#xff0c;通过逆向工程来获取对应关卡的字符串 准备工作 环境 需要用到gdb调试器 apt-get install gdb系统: Ubuntu 22.04 本实验会用到的gdb调试器的指令如下 r或者 run或者run filename 运行程序,run filename就是…

8----代码块

一、行内代码​ 使用一对反引号()来创建行内代码。 如果在行内代码中需要包含反引号本身&#xff0c;可以使用两个反引号对加前后空格来创建。(但是这样的代码块不会进行语法高亮&#xff0c;只是简单地将代码以等宽字体显示) 注&#xff1a;反引号在键盘上位于左上角&#xff…

用Python打造复古风格的游戏:回归8位时代【俄罗斯方块】

大家好&#xff0c;我是辣条&#xff01; 今天带大家来写一个说难不难&#xff0c;说简单也不算接单的复古小游戏&#xff1a;俄罗斯方块游戏&#xff01; 目录 前言&#xff1a;步骤首先接下来然后接下来最后 上代码&#xff1a;总结: 前言&#xff1a; 俄罗斯方块是一款经典…

PyTorch深度学习实战——使用卷积神经网络执行图像分类

PyTorch深度学习实战——使用卷积神经网络执行图像分类 0. 前言1. Fashion-MNIST 数据集图像分类2. 模型测试相关链接 0. 前言 我们已经在《卷积神经网络详解》一节中介绍了传统神经网络在面对图像平移时的问题以及卷积神经网络 (Convolutional Neural Network, CNN) 的工作原…

CSS 字体修饰属性

前言 字体修饰属性 属性说明font-family指定文本显示字体font-size设置字体的大小font-weight设置字体的粗细程度font-style设置字体的倾斜样式text-decoration给文本添加装饰线text-indent设置文本的缩进text-align设置文本的对齐方式line-height设置行高color设置文本的颜色…

IDEA常用插件推荐(个人)

分享下个人在大厂工作四五年的一个常用配置插件 一、Alibaba Java Coding Guidelines 代码规范插件(必备) 阿里巴巴代码规范检查 人手必备。减少你的垃圾代码 各种不良提示代码全靠它了。 代码划线的嘎嘎 crtlenter优化得了 二、Atom Material File Icons 图标主题插件(提示…

Java学习手册——第二篇面向对象程序设计

Java学习手册——第二篇面向对象 1. 结构化程序设计2. 面向对象 第一章我们已经介绍了Java语言的基础知识&#xff0c;也知道他能干什么了&#xff0c; 那我们就从他的设计思想开始入手吧。 接触一个语言之前首先要知道他的大方向&#xff0c;设计思想是什么样的&#xff0c; 这…

【高阶数据结构】红黑树详解

文章目录 前言1. 红黑树的概念及性质1.1 红黑树的概念1.2 红黑树的性质1.3 已经学了AVL树&#xff0c;为啥还要学红黑树 2. 红黑树结构的定义3. 插入&#xff08;仅仅是插入过程&#xff09;4. 插入结点之后根据情况进行相应调整4.1 cur为红&#xff0c;p为红&#xff0c;g为黑…

Redis——哨兵模式(docker部署redis哨兵)+缓存穿透和雪崩

哨兵模式 自动选取主机的模式。 概述 主从切换技术的方法是:当主服务器宕机后&#xff0c;需要手动把一台从服务器切换为主服务器&#xff0c;这就需要人工干预&#xff0c;费事费力&#xff0c;还会造成段时间内服务不可用。这不是一种推荐的方式&#xff0c;更多时候&…