位置: 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)(斯塔尔德)

  • 华为p40都是5g版本手机吗(华为p40系列都是5g吗)

    华为p40都是5g版本手机吗(华为p40系列都是5g吗)

  • 淘宝确认收货后怎么换货(淘宝确认收货后怎么申请退款)

    淘宝确认收货后怎么换货(淘宝确认收货后怎么申请退款)

  • 小米手机怎么制作长图照片(小米手机怎么制作手机铃声)

    小米手机怎么制作长图照片(小米手机怎么制作手机铃声)

  • 超频开不了机怎么办(超频开不开机黑屏怎么办)

    超频开不了机怎么办(超频开不开机黑屏怎么办)

  • 苹果11新机有划痕正常吗(苹果11有划痕怎么修复)

    苹果11新机有划痕正常吗(苹果11有划痕怎么修复)

  • 怎么让ipad声音变大(如何将ipad声音增大)

    怎么让ipad声音变大(如何将ipad声音增大)

  • 华为怎么取消支付保护(华为怎么取消支付宝免密支付)

    华为怎么取消支付保护(华为怎么取消支付宝免密支付)

  • 老电脑很卡加内存条能解决吗(老电脑卡加内存条有用吗)

    老电脑很卡加内存条能解决吗(老电脑卡加内存条有用吗)

  • 微信被举报几次会被封号(微信举报几次永久封号)

    微信被举报几次会被封号(微信举报几次永久封号)

  • 入门级独显是什么意思(什么叫入门级独显)

    入门级独显是什么意思(什么叫入门级独显)

  • 为什么手机升级系统反应慢了(华为手机怎么升级系统)

    为什么手机升级系统反应慢了(华为手机怎么升级系统)

  • 电信hd通话收费吗(电信hd怎么收费)

    电信hd通话收费吗(电信hd怎么收费)

  • 抖音注销后身份证可以绑定其他号嘛(抖音注销后身份信息还可以用吗)

    抖音注销后身份证可以绑定其他号嘛(抖音注销后身份信息还可以用吗)

  • win10如何开启远程控制(win10如何开启远程连接服务)

    win10如何开启远程控制(win10如何开启远程连接服务)

  • 苹果xs自带美颜吗(苹果xs美颜相机怎么设置)

    苹果xs自带美颜吗(苹果xs美颜相机怎么设置)

  • 手机一体机是什么意思(手机一体机是什么时候出来的)

    手机一体机是什么意思(手机一体机是什么时候出来的)

  • 荣耀手环5i支持支付宝吗(荣耀手环5i支持移动支付吗)

    荣耀手环5i支持支付宝吗(荣耀手环5i支持移动支付吗)

  • 千牛动态评分几点更新(千牛店铺评分更新时间)

    千牛动态评分几点更新(千牛店铺评分更新时间)

  • 如何开启获取手机信息权限(手机获取)

    如何开启获取手机信息权限(手机获取)

  • 苹果手机呼吸灯怎么关(苹果手机呼吸灯闪烁怎么设置)

    苹果手机呼吸灯怎么关(苹果手机呼吸灯闪烁怎么设置)

  • office不激活有影响吗(office不激活影响电脑使用吗)

    office不激活有影响吗(office不激活影响电脑使用吗)

  • 新版手机迅雷私人空间在哪里(新版手机迅雷私人空间密码忘了)

    新版手机迅雷私人空间在哪里(新版手机迅雷私人空间密码忘了)

  • 开发微信商城需要哪些功能(开发微信商城需要花钱吗)

    开发微信商城需要哪些功能(开发微信商城需要花钱吗)

  • 大提顿国家公园中的Old Patriarch Tree,怀俄明州 (© George Sanker/Minden Pictures)(哪一个国家有大提顿国家公园)

    大提顿国家公园中的Old Patriarch Tree,怀俄明州 (© George Sanker/Minden Pictures)(哪一个国家有大提顿国家公园)

  • 微软调整 Win11 的 Alt + Tab 功能,最多只支持切换 20 个最近标签页(微软调整bing输入字数)

    微软调整 Win11 的 Alt + Tab 功能,最多只支持切换 20 个最近标签页(微软调整bing输入字数)

  • uni-app组件-应用简单快速上线(uniapp组件使用)

    uni-app组件-应用简单快速上线(uniapp组件使用)

  • 个人独资企业的责任承担
  • 不动产统一发票图片
  • 抄报未反写影响开票吗
  • 房屋出租怎么交税?
  • 去年已认证发票红冲怎么报税
  • 建筑安装专票票样
  • 烟草批发环节加征的消费税税率是多少
  • 预缴两个点的税是什么意思
  • 工会经费的纳税依据
  • 收到政府补贴要交增值税吗
  • 小规模纳税人三个月做一次账
  • 固定资产出售后净残值怎么处理
  • 企业所得税一季度盈利二季度亏损
  • 汇丰银行账户管理费
  • 网卡运行异常
  • 取得进账发票没发票
  • 房地产企业使用什么准则
  • 对公收到别人的转账怎么记账
  • php调用mysql索引查询
  • windows11 beta渠道
  • 企业取得的搬迁补贴
  • 有限公司股权转让怎么办理流程
  • Cusco Cathedral on the Plaza de Armas, Cusco, Peru (© sharptoyou/Shutterstock)
  • 跨区域涉税事项报告表在哪里打印
  • 业务招待费个税账务处理办法
  • 其他债权投资和持有至到期投资的区别
  • 好用的5款国产手机推荐
  • 超像素和markpage的区别
  • vue组件之间传值几种方法
  • vue父子组件传值
  • 润滑脂开票属于哪一类
  • 员工高铁票能抵扣吗
  • 增值税普通发票查询
  • 工资结算汇总表怎么填
  • 个体户怎么计算养老金
  • sql语句取并集
  • 土地增值税清算收入如何确定
  • 从内地到香港坐飞机到国内
  • 汇算清缴前取得暂估发票
  • 商品的结构
  • 报关单是美元收欧元
  • 赔偿金是营业外收入吗
  • 金蝶k3怎么打印科目余额表
  • 收入的确认条件包括
  • 自制半成品销售方案
  • 固定资产处置有净值怎么处理
  • 管理费用是负数怎么处理
  • 企业应如何正确经营
  • 中小型企业会计
  • centos rpm命令
  • sqlserver存储过程实例详解
  • mac上怎么取消itunes自动续费
  • win8怎么打开系统设置
  • Linux Kernel 4.10第5个候选版本RTM版发布 2月12日发布正式版
  • centos安装问题
  • centos默认字体
  • win10电脑提示
  • win10应用商店不好用
  • 虚拟机安装win8系统
  • html5lib
  • 教你一行代码
  • 动作
  • unity单选
  • windows和linux的区别
  • python3网络爬虫
  • JAVAscript字符串类型单引号和双引号意一样吗
  • javascript的
  • Android UI之LinearLayout(线性布局)
  • python爬虫模拟登录亚马逊
  • 聊天界面的新消息通知设置 找不到
  • android内存优化三 简书
  • js对象创建方法
  • jquery教程chm
  • androidstudio性能检测工具
  • javascript面向对象精要pdf
  • flask框架官方文档
  • 个人所得税其他公司在为我发放工资
  • 北京税务分所怎么样啊
  • 小规模税控盘全额抵扣怎么做分录
  • 2020年河南麦收时间
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设