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

  • 铃声在哪里设置(微信换铃声在哪里设置)

    铃声在哪里设置(微信换铃声在哪里设置)

  • 微信扫脸验证在哪里设置(微信验证脸部识别在哪里)

    微信扫脸验证在哪里设置(微信验证脸部识别在哪里)

  • 钉钉怎么换另一个班级(钉钉怎么换另一个号登录)

    钉钉怎么换另一个班级(钉钉怎么换另一个号登录)

  • 淘友圈可以看见访客记录吗(淘友圈能看到)

    淘友圈可以看见访客记录吗(淘友圈能看到)

  • 华为5g双模手机有什么好处(华为5g双模手机是什么意思)

    华为5g双模手机有什么好处(华为5g双模手机是什么意思)

  • 为什么淘宝没有省钱卡(为什么淘宝没有先用后付)

    为什么淘宝没有省钱卡(为什么淘宝没有先用后付)

  • word转pdf页眉变了(word2007转pdf页眉丢失)

    word转pdf页眉变了(word2007转pdf页眉丢失)

  • 华为p30防水吗(华为p30防水吗,掉水里了怎么办)

    华为p30防水吗(华为p30防水吗,掉水里了怎么办)

  • hdaudio接主板哪里(hdaudio接主板哪里华硕b660m)

    hdaudio接主板哪里(hdaudio接主板哪里华硕b660m)

  • 苹果11屏幕是lcd还是oled(苹果12原装屏幕)

    苹果11屏幕是lcd还是oled(苹果12原装屏幕)

  • sjmp指令是什么意思(ajmp是什么指令)

    sjmp指令是什么意思(ajmp是什么指令)

  • qmv用什么打开(怎么打开qmcflac格式音乐)

    qmv用什么打开(怎么打开qmcflac格式音乐)

  • 荣耀magic2屏幕刷新率(荣耀magic2屏幕刷新率怎么调)

    荣耀magic2屏幕刷新率(荣耀magic2屏幕刷新率怎么调)

  • qq为什么开不了情侣空间(qq为什么开不了分享屏幕)

    qq为什么开不了情侣空间(qq为什么开不了分享屏幕)

  • nex是什么牌子(prokennex是什么牌子)

    nex是什么牌子(prokennex是什么牌子)

  • 京东秒杀是什么意思(京东 秒杀什么意思)

    京东秒杀是什么意思(京东 秒杀什么意思)

  • 显卡是什么(显卡是什么意思)

    显卡是什么(显卡是什么意思)

  • oppo手机声音太小如何解决(oppo手机声音太小)

    oppo手机声音太小如何解决(oppo手机声音太小)

  • 红米note8电池容量多大(redmi note8电池)

    红米note8电池容量多大(redmi note8电池)

  • vivos1出来多久了(vivos1几几年出的)

    vivos1出来多久了(vivos1几几年出的)

  • 拼多多极速退款系统审核规则(拼多多极速退款商家申诉能追回钱来吗)

    拼多多极速退款系统审核规则(拼多多极速退款商家申诉能追回钱来吗)

  • 云同步在哪里打开(云同步在哪里打开 华为)

    云同步在哪里打开(云同步在哪里打开 华为)

  • 苹果怎么拉黑电话(苹果怎么拉黑电话号码让对方拨打电话过来是关机状态)

    苹果怎么拉黑电话(苹果怎么拉黑电话号码让对方拨打电话过来是关机状态)

  • oppo手机视频怎么剪辑(oppo手机视频怎么传到u 盘上)

    oppo手机视频怎么剪辑(oppo手机视频怎么传到u 盘上)

  • jmgo投影仪如何连手机(jmgo投影仪如何连手机投屏)

    jmgo投影仪如何连手机(jmgo投影仪如何连手机投屏)

  • 拼多多怎么复制商品链接(拼多多怎么复制商品上架)

    拼多多怎么复制商品链接(拼多多怎么复制商品上架)

  • 印花税购销合同包括哪些
  • 月末只有进项税需要把转出未交增值税转到未交增值税
  • 报销单与发票金额不符
  • 冲销以前年度营业外支出
  • 公积金做账需要计提吗怎么做
  • 电子发票红字发票怎么开
  • 增值税普通发票有什么用
  • 公司支付佣金给个人合法吗
  • 企业所得税税率有几个档次
  • 开立基本账户所需资料
  • 税收滞纳金什么意思
  • 待处理财产损益是什么意思
  • 代扣代缴个人所得税手续费返还 增值税
  • 仓储费用的增值税计入哪里
  • 中国人民银行保险公司
  • 消费税税目是否含税
  • 开户许可证复印件是什么
  • 居民供暖税率
  • 投资性房地产的后续计量从成本模式转为公允价值模式的
  • 电脑win10点开始没反应
  • 收到投资款如何记账
  • 抵扣联必须当月认证吗
  • 公司治理的基本内涵
  • 支付设备维修费用计入什么科目
  • 购货优惠的会计科目
  • 冲销去年暂估收入
  • node -v
  • 今天端午节?
  • 前端uniapp写表格
  • php实现和工作原理
  • web漏洞扫描器的设计与实现
  • 莫尔道嘎湿地公园
  • thinkphp框架入门
  • elementui 手机端
  • 租金和物业管理费税率
  • 已勾选确认的发票怎样撤销勾选
  • web前端开发学什么
  • Vue+Element UI-el-date-picker时间日期选择器组件(实现向后端传值)
  • nodejs如何与前端交互
  • 手把手教你安装技嘉b550 master主板
  • php判断手机浏览记录数据
  • packet命令
  • 人民币跨境贸易占比
  • 未实现汇兑损益如何计算
  • python装饰器如何保留原函数信息
  • 劳务成本 科目
  • 工地会计内账
  • 关于税务机关扣押程序
  • 支付宝和微信的财务统计
  • 应交税费减免税款怎么结转
  • 劳务派遣公司账务
  • 对公账户转私人账户有限额吗
  • 住房租金专项附加扣除金额
  • 购销合同印花税2023年新规定
  • MySQL数据库中把表中的一个字段重命名
  • Slave memory leak and trigger oom-killer
  • linux如何安装c语言编译器
  • jdbc取数据
  • 在SQL查询中使用WHERE子句指出的是
  • win2000系统
  • win8.1 升级
  • 为什么要淘汰相关性高的指标
  • Linux中如何查看文件大小
  • linux系统ln命令
  • linux远程操作常用命令
  • windowsxp入门
  • WIN10系统中没有接入音频设备 要启动gui
  • win10系统无法打开设置
  • JavaScript中的数据类型分为两大类
  • python必学的os模块详解
  • cocos2dx-3.0(23) ScrollView 缩放 及 touch新用法
  • shell获取文件内容给变量
  • js中写for循环
  • js日历控件代码和效果
  • 基于python的
  • Python连接MySQL并使用fetchall()方法过滤特殊字符
  • JavaScript性能优化
  • 运输费用抵扣税率最新规定
  • 个人怎么在网上交医保和养老保险
  • 去银行签贷款合同后多久办过户
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设