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

  • 什么样的内容最吸引微博粉丝呢?(什么样的内容最吸引读者呢)

    什么样的内容最吸引微博粉丝呢?(什么样的内容最吸引读者呢)

  • 三星折叠手机外屏怎么拍照(三星折叠手机外屏壁纸怎么设置)

    三星折叠手机外屏怎么拍照(三星折叠手机外屏壁纸怎么设置)

  • 微软模拟飞行怎么调中文(微软模拟飞行怎么推动控制杆)

    微软模拟飞行怎么调中文(微软模拟飞行怎么推动控制杆)

  • android什么手机牌子(ANDROID什么手机型号)

    android什么手机牌子(ANDROID什么手机型号)

  • soul陌生人可见在广场可见吗(soul陌生人可见是哪些人)

    soul陌生人可见在广场可见吗(soul陌生人可见是哪些人)

  • 计算机指令中规定该指令执行功能的部分称为(计算机指令中规定执行操作功能的是)

    计算机指令中规定该指令执行功能的部分称为(计算机指令中规定执行操作功能的是)

  • 苹果系统尽量不更新吗(2021苹果系统尽量不更新吗)

    苹果系统尽量不更新吗(2021苹果系统尽量不更新吗)

  • qq发的视频看不了怎么回事(qq发的视频看不到)

    qq发的视频看不了怎么回事(qq发的视频看不到)

  • 苹果电脑可以下载抖音吗(苹果电脑可以下载office吗)

    苹果电脑可以下载抖音吗(苹果电脑可以下载office吗)

  • 局部视图的断裂边界用什么表示(局部视图的断裂边界用)

    局部视图的断裂边界用什么表示(局部视图的断裂边界用)

  • 为什么连了蓝牙wifi网速慢(为什么连了蓝牙还是手机外放)

    为什么连了蓝牙wifi网速慢(为什么连了蓝牙还是手机外放)

  • 计算机中byte的意思是(计算机中byte和bit)

    计算机中byte的意思是(计算机中byte和bit)

  • 手机前面的小孔是什么(手机前面的小孔进水怎么办)

    手机前面的小孔是什么(手机前面的小孔进水怎么办)

  • 手机为什么插卡无服务(手机为什么插卡不能用)

    手机为什么插卡无服务(手机为什么插卡不能用)

  • 微信乱封号怎么申诉(微信乱封号怎么办)

    微信乱封号怎么申诉(微信乱封号怎么办)

  • 抖音时间特效慢动作怎么用(抖音特效慢镜头在哪)

    抖音时间特效慢动作怎么用(抖音特效慢镜头在哪)

  • 华为荣耀4手环可以接电话吗(华为荣耀4手环running变暗了)

    华为荣耀4手环可以接电话吗(华为荣耀4手环running变暗了)

  • 硬盘下安装Ghost系统简易教程(通用版)(硬盘 安装系统)

    硬盘下安装Ghost系统简易教程(通用版)(硬盘 安装系统)

  • 珊瑚礁周围的丝鳍拟花鮨鱼群,澳大利亚昆士兰大堡礁 (© Gary Bell/Minden Pictures)(珊瑚礁区域常有的鱼类)

    珊瑚礁周围的丝鳍拟花鮨鱼群,澳大利亚昆士兰大堡礁 (© Gary Bell/Minden Pictures)(珊瑚礁区域常有的鱼类)

  • 网站为什么需要定期改版(网站为什么需要备案)

    网站为什么需要定期改版(网站为什么需要备案)

  • Jvm调优(jvm调优思路)

    Jvm调优(jvm调优思路)

  • 税务ukey与税控盘的区别
  • 其他负债是流动负债还是非流动负债
  • 小规模纳税人税费会计分录
  • 异地预缴税款不交可以吗
  • 企业所得税零申报表怎么填写
  • 印花税怎么计提和缴纳
  • 退税流程怎么操作APP
  • 调整上月的生产成本
  • 对外支付代扣代缴企业所得税
  • 现金流管理模式
  • 开发商买商铺
  • 验资报告费用计入什么科目
  • 一个企业只有收入没有支出合理吗
  • 成本暂估跨年度要怎么处理?
  • 房地产公司预收账款明细科目
  • 项目部管理人员及作业人员的
  • 税控盘抵扣联附在哪里
  • 税率开错跨月没法收回
  • 接受实物投资的增值税会计核算方法
  • 通用机打发票没写税额
  • 适用简易计税方法的企业提供适用零税率的应税服务
  • 工资薪金总额是指月还是全年
  • 广告费扣除年限
  • 以现金形式发放的员工餐费补贴,可并入职工福利费
  • 大连国税局工资待遇怎么样
  • 关于环保税税目正确的有
  • 利润总额就是会计准则吗
  • 取得高新技术企业
  • 坏账准备什么时候转回
  • 本月销项大于进项
  • 销售商品会计分录怎么写
  • 电子银行汇票 票据承兑
  • Win10中macos big sur虚拟机无法连接网络怎么办?
  • 预付加油充值卡可以报销吗
  • 专用发票增量申请流程
  • 跳线和短接
  • 材料入库款项未付会计分录
  • 浅谈php中的错误处理方法
  • php json_encode与json_decode详解及实例
  • 公司上市的好处
  • vue路由实例
  • openssl 加密套件
  • mzip命令 控制磁盘驱动器
  • 个税可以补申报几个月的码
  • 房产增值税计税依据及计算方式
  • mysql存储过程语句
  • sql 字符串
  • 费用多报销了,但已经给了,怎么办
  • 期末留抵退税计算公式
  • 收到住宿费普通发票会计分录
  • 关于利润分配科目的表述正确的有
  • 代收运输费的会计分录
  • 政府给的专款专用的补贴需要交税吗
  • 工程结算材料款抵扣增值税
  • 销售返利的会计处理方法
  • 首先要知道什么英语
  • 什么是现金等价物
  • sqlserver中将varchar类型转换为int型再进行排序的方法
  • sqlserver存储过程实例详解
  • sqlserver数据库维护
  • window怎么样
  • 配置windows server 2008
  • 苹果发布会最新消息
  • 本地hosts文件存在问题
  • u盘做pe后还能存储吗
  • win7系统打开我的电脑一闪
  • linux 磁带机
  • js表单验证代码Email
  • jQuery Validation PlugIn的使用方法详解
  • 抽奖小程序模板
  • jquery鼠标点击事件怎么写
  • nodejs开发web
  • jQuery实现的tab标签切换效果示例
  • jQuery判断checkbox选中状态
  • android 启动器 设置
  • 怎么在国家税务局查发票
  • 仓库需要交房产税吗
  • 攸县丧葬
  • 增值税专用发票上传是什么意思
  • 企业申报系统网址
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设