位置: IT常识 - 正文

el-table表格动态合并行、合并行列及详解(el-table-column label动态)

编辑:rootadmin
el-table表格动态合并行、合并行列及详解

推荐整理分享el-table表格动态合并行、合并行列及详解(el-table-column label动态),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:element 动态表格,el-table动态表头,element 动态表格,el-table动态数据,el-table动态表头,el-table-column label动态,eltable动态列,el-table 动态列,内容如对您有帮助,希望把文章链接给更多的朋友!

📝 个人简介

⭐ 个人主页:我是段段🙋‍ 🍊 博客领域:编程基础、前端💻 🍅 写作风格:干货!干货!都是干货! 🍑 精选专栏:Vue 🛸 支持段段:点赞👍、收藏⭐、留言💬

文章目录前言1、合并行2、合并行列前言

在写项目的时候有时候会经常遇到把行和列合并起来的情况,因为有些数据是重复渲染的,不合并行列会使表格看起来非常的混乱,如下:

而我们想要的数据是下面这种情况,将重复的行进行合并,使表格看起来简单明了,如下:

1、合并行

所谓的合并行就是将多行相同的数据变成一行来显示,直接上代码,页面的布局比较简单

<template> <div class="table"> <el-table :data="tableData" :span-method="objectSpanMethod" border style="width: 100%"> <el-table-column prop="time" label="时间"></el-table-column> <el-table-column prop="grade" label="年级"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="subjects" label="科目"></el-table-column> <el-table-column prop="score" label="成绩"></el-table-column> </el-table> </div></template>

span-method是el-table上属性,其值是一个函数,objectSpanMethod方法是用来处理合并行的返回值,tableData数据如下:

tableData: [ { time: '2020-08-10', grade: '三年二班', name: '小明', subjects: '语文', score: 80 }, { time: '2020-08-10', grade: '三年二班', name: '小明', subjects: '数学', score: 80 }, { time: '2020-08-10', grade: '三年一班', name: '小雷', subjects: '语文', score: 70 }, { time: '2020-08-10', grade: '三年一班', name: '小雷', subjects: '数学', score: 80 }, { time: '2020-08-11', grade: '三年三班', name: '小花', subjects: '语文', score: 60 }, { time: '2020-08-11', grade: '三年三班', name: '小花', subjects: '数学', score: 60 }, ],mergeObj: {}, // 用来记录需要合并行的下标mergeArr: ['time', 'grade', 'name', 'subjects', 'score'] // 表格中的列名el-table表格动态合并行、合并行列及详解(el-table-column label动态)

首先需要对数据就行处理,就是比较当前行与上一行的值是否相等(如果是第一行数据,直接将值赋值为1)

在mounted中调用数据初始化数据的方法,如下:

mounted() { this.getSpanArr(this.tableData);}// getSpanArr方法getSpanArr(data) { this.mergeArr.forEach((key, index1) => { let count = 0; // 用来记录需要合并行的起始位置 this.mergeObj[key] = []; // 记录每一列的合并信息 data.forEach((item, index) => { // index == 0表示数据为第一行,直接 push 一个 1 if(index === 0) { this.mergeObj[key].push(1); } else { // 判断当前行是否与上一行其值相等 如果相等 在 count 记录的位置其值 +1 表示当前行需要合并 并push 一个 0 作为占位 if(item[key] === data[index - 1][key]) { this.mergeObj[key][count] += 1; this.mergeObj[key].push(0); } else { // 如果当前行和上一行其值不相等 count = index; // 记录当前位置 this.mergeObj[key].push(1); // 重新push 一个 1 } } }) })}

数据处理好之后就可以调用objectSpanMethod方法了,如下:

// objectSpanMethod方法// 默认接受四个值 { 当前行的值, 当前列的值, 行的下标, 列的下标 }objectSpanMethod({ row, column, rowIndex, columnIndex }) { // 判断列的属性 if(this.mergeArr.indexOf(column.property) !== -1) { // 判断其值是不是为0 if(this.mergeObj[column.property][rowIndex]) { return [this.mergeObj[column.property][rowIndex], 1] } else { // 如果为0则为需要合并的行 return [0, 0]; } }}

合并后的结果就是我们想要的形式: 合并行完整的代码如下:

<template> <div class="table"> <el-table :data="tableData" :span-method="objectSpanMethod" border style="width: 100%"> <el-table-column prop="time" label="时间"></el-table-column> <el-table-column prop="grade" label="年级"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="subjects" label="科目"></el-table-column> <el-table-column prop="score" label="成绩"></el-table-column> </el-table> </div></template><script>export default { name: 'Table', data() { return { tableData: [ { time: '2020-08-10', grade: '三年二班', name: '小明', subjects: '语文', score: 80 }, { time: '2020-08-10', grade: '三年二班', name: '小明', subjects: '数学', score: 80 }, { time: '2020-08-10', grade: '三年一班', name: '小雷', subjects: '语文', score: 70 }, { time: '2020-08-10', grade: '三年一班', name: '小雷', subjects: '数学', score: 80 }, { time: '2020-08-11', grade: '三年三班', name: '小花', subjects: '语文', score: 60 }, { time: '2020-08-11', grade: '三年三班', name: '小花', subjects: '数学', score: 60 }, ], mergeObj: {}, mergeArr: ['time', 'grade', 'name', 'subjects', 'score'], }; }, methods: { getSpanArr(data) { this.mergeArr.forEach((key, index1) => { let count = 0; // 用来记录需要合并行的起始位置 this.mergeObj[key] = []; // 记录每一列的合并信息 data.forEach((item, index) => { // index == 0表示数据为第一行,直接 push 一个 1 if(index === 0) { this.mergeObj[key].push(1); } else { // 判断当前行是否与上一行其值相等 如果相等 在 count 记录的位置其值 +1 表示当前行需要合并 并push 一个 0 作为占位 if(item[key] === data[index - 1][key]) { this.mergeObj[key][count] += 1; this.mergeObj[key].push(0); } else { // 如果当前行和上一行其值不相等 count = index; // 记录当前位置 this.mergeObj[key].push(1); // 重新push 一个 1 } } }) }) }, // 默认接受四个值 { 当前行的值, 当前列的值, 行的下标, 列的下标 } objectSpanMethod({ row, column, rowIndex, columnIndex }) { // 判断列的属性 if(this.mergeArr.indexOf(column.property) !== -1) { // 判断其值是不是为0 if(this.mergeObj[column.property][rowIndex]) { return [this.mergeObj[column.property][rowIndex], 1] } else { // 如果为0则为需要合并的行 return [0, 0]; } } } }, mounted() { this.getSpanArr(this.tableData); }};</script><style lang="stylus" scoped>.table height 100vh width 100% padding 40px box-sizing border-box /deep/ .el-table__body tr:hover > td background-color: #fff;</style>2、合并行列

调整下数据,如下:

tableData: [ { time: '2020-08-10', grade: '三年二班', name: '小明', subjects: '语文', score: 80 }, { time: '2020-08-10', grade: '三年二班', name: '小明', subjects: '数学', score: 80 }, { time: '2020-08-10', grade: '总成绩', name: '总成绩', subjects: '总成绩', score: 160 }, { time: '2020-08-10', grade: '三年一班', name: '小雷', subjects: '语文', score: 70 }, { time: '2020-08-10', grade: '三年一班', name: '小雷', subjects: '数学', score: 80 }, { time: '2020-08-10', grade: '总成绩', name: '总成绩', subjects: '总成绩', score: 150 }, { time: '2020-08-11', grade: '三年三班', name: '小花', subjects: '语文', score: 60 }, { time: '2020-08-11', grade: '三年三班', name: '小花', subjects: '数学', score: 60 }, { time: '2020-08-11', grade: '总成绩', name: '总成绩', subjects: '总成绩', score: 120 }],

可以看到上面的数据多了一行总成绩,现在的数据在页面显示效果如下:

可以看到总成绩的三个列并没有合并,并不是我们想要的效果,所以需要换一种思路来处理数据

页面的布局也有所调整,如下:

<template> <div class="table"> <el-table :data="tableData" :span-method="objectSpanMethods" border style="width: 100%"> <template v-for="cols in colConfigs"> <!-- 无需合并的列 --> <el-table-column v-if="cols.type === 'label' && !cols.children" :key="cols.prop" :prop="cols.prop" :label="cols.label" > </el-table-column> <!-- 需要合并的列 --> <template v-else-if="cols.type === 'label' && cols.children"> <el-table-column v-for="children in cols.children" :key="children.prop" :prop="children.prop" :label="children.label" /> </template> </template> </el-table> </div></template>

tableData中的数据就是上面调整后的,还需要

本文链接地址:https://www.jiuchutong.com/zhishi/287294.html 转载请保留说明!

上一篇:野花草甸上的一只欧亚雕鸮,德国莱茵兰-普法尔茨 (© Rosl Roessner/Minden Pictures)(草丛里的野花像)

下一篇:斯塔德兰附近荒野上丛生的紫色和粉红色帚石楠,英国多塞特郡 (© allou/iStock/Getty Images Plus)(斯塔尔德)

  • nova7se和nova7pro的区别有哪些(nova7se对比nova7pro)

    nova7se和nova7pro的区别有哪些(nova7se对比nova7pro)

  • 正在检查磁盘错误,这可能要花费一个多小时怎么回事(正在检查磁盘错误一个多小时)

    正在检查磁盘错误,这可能要花费一个多小时怎么回事(正在检查磁盘错误一个多小时)

  • 电脑如何设置定时开关机(电脑如何设置定时播放音乐)

    电脑如何设置定时开关机(电脑如何设置定时播放音乐)

  • 优酷为什么这么卡(优酷为什么这么贵)

    优酷为什么这么卡(优酷为什么这么贵)

  • 抖音极速版怎么找订单(抖音极速版怎么填写邀请码)

    抖音极速版怎么找订单(抖音极速版怎么填写邀请码)

  • 电话打通了对方无响应(电话打通了对方不说话)

    电话打通了对方无响应(电话打通了对方不说话)

  • 拼多多已发货怎么拒收(拼多多已发货怎么重新打印面单)

    拼多多已发货怎么拒收(拼多多已发货怎么重新打印面单)

  • scada系统是什么意思啊

    scada系统是什么意思啊

  • 微信头像抖动对方知道吗(微信头像抖了一下什么意思)

    微信头像抖动对方知道吗(微信头像抖了一下什么意思)

  • 笔记本工作站什么意思(笔记本工作站哪个牌子好)

    笔记本工作站什么意思(笔记本工作站哪个牌子好)

  • 苹果自录视频功能在哪(苹果自己录视频怎么设置)

    苹果自录视频功能在哪(苹果自己录视频怎么设置)

  • 朋友圈视频没声音怎么回事(朋友圈视频没声音了怎么回事)

    朋友圈视频没声音怎么回事(朋友圈视频没声音了怎么回事)

  • 趣配音的视频怎么下载(趣配音的视频怎么免费下载到手机上)

    趣配音的视频怎么下载(趣配音的视频怎么免费下载到手机上)

  • 兄弟7080加粉清零方法(兄弟7080加粉清零图文)

    兄弟7080加粉清零方法(兄弟7080加粉清零图文)

  • 怎么下载秒懂百科里的视频(怎么下载秒懂百科)

    怎么下载秒懂百科里的视频(怎么下载秒懂百科)

  • 抖音隐私设置关注不了(抖音隐私设置关注了可以发消息吗)

    抖音隐私设置关注不了(抖音隐私设置关注了可以发消息吗)

  • vivo手机有红外线功能吗(vivo手机有红外功能吗?当遥控器用)

    vivo手机有红外线功能吗(vivo手机有红外功能吗?当遥控器用)

  • 苹果x怎么开启反向充电(苹果x怎么开启静音模式)

    苹果x怎么开启反向充电(苹果x怎么开启静音模式)

  • 小米9 pro 5G配置参数(小米九pro5g参数)

    小米9 pro 5G配置参数(小米九pro5g参数)

  • 车旺大卡怎么分享给别人(车旺大卡怎么分享永久怎么取消)

    车旺大卡怎么分享给别人(车旺大卡怎么分享永久怎么取消)

  • 陌陌卸载后什么状态(陌陌卸载之后别人还能看到我吗)

    陌陌卸载后什么状态(陌陌卸载之后别人还能看到我吗)

  • qq怎么显示红色昵称(qq怎么显示红色闪电标志)

    qq怎么显示红色昵称(qq怎么显示红色闪电标志)

  • 艺术字的文字效果在哪(艺术字的文字效果为转换跟随路径上弯弧)

    艺术字的文字效果在哪(艺术字的文字效果为转换跟随路径上弯弧)

  • 如何取消拼多浮窗(拼多多如何取消浮窗设置)

    如何取消拼多浮窗(拼多多如何取消浮窗设置)

  • ChatGPT 被大面积封号,到底发生什么了?

    ChatGPT 被大面积封号,到底发生什么了?

  • 材料用于非应税项目
  • 缴纳印花税的会计科目
  • 开咨询费需要合同吗
  • 冲红的专票要给购买方吗
  • 连锁店每个店都要独立核算吗
  • 补提上年度所得税影响本年所得税吗
  • 财产保险合同印花税计税依据
  • 开具成品油专用发票时,应遵守哪些规则
  • 物业补贴计入什么科目
  • 应收而未收的装修款如何做账务处理?
  • 年底结账会计处理
  • 如何查询增值税申报表
  • 企业税前扣除凭证包括以下哪些方面
  • 维修材料费主要包括
  • 购买软件会计账务处理
  • 小型微利企业能开多少发票
  • 原材料总分类账怎么写
  • 公司年终分红如何入账
  • 集体福利是否可以抵税
  • 增值税发票系统升级版
  • 企业所得税一季度盈利二季度亏损
  • 二手车交易增值税按照多少征收税率减半征收
  • 工程施工购买的材料费会计分录
  • 稿酬所得怎么纳税
  • mmc.exe是什么进程
  • php初学者常见问题和答案
  • gazebo中机器人导航在rviz中不显示地图仅限显示轨迹
  • php 字符串 数组
  • 采购物资发生什么费用
  • php exit绕过
  • winform 文件上传
  • 发票开错需要让客户寄回来吗
  • 面试学弟学妹问题
  • h5项目怎么打包成app
  • 城建税退回与不退税区别
  • 房租税务局代增值税发票 税点
  • 发票申请条件
  • 应计入营业外支出的科目有
  • mysql好在哪里
  • 存货的成本包括哪几项
  • 娱乐服务计费销售额包括
  • 权益性投资收益按照什么确认收入的实现
  • 软件产品销售合同范本
  • 核算税金怎么核算
  • 一般纳税人抵扣进项税流程
  • 固定资产折旧是什么意思
  • 应收票据和应收账款减少说明什么
  • 小规模纳税人应纳增值税额的计算
  • 会计建账的基本程序的六个步骤
  • sqlserver字符函数
  • sqlserver日志已满
  • 电脑出现bootbcd
  • win8 怎么样
  • windows server vista
  • centos用途
  • 设置u盘为只读
  • 加载dll错误是什么意思
  • win8怎么卸载应用程序
  • mac系统如何切换中文
  • win8录音文件保存在哪
  • linux,Centos5,Ubuntu关掉ipv6的方法
  • 什么叫linux
  • 如何在win7系统中查看电脑基本信息
  • win7修改系统版本
  • 安装音乐库
  • android知识
  • BootStrap TreeView使用实例详解
  • 文本框后缀
  • 安卓十游戏怎么玩
  • nodejs安装在c盘好还是d盘好
  • JavaScript事件处理器中的event参数使用介绍
  • unity 游戏
  • javascript什么用
  • js类的实现
  • andorids
  • 电子湖北税务局
  • 出口退税全流程
  • 税务稽查局什么时候独立出来
  • 营销服务协议书范本
  • 湖北省税务发票
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设