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

  • iphone自动删除app怎么关闭(iphone自动删除照片怎么回事情)

    iphone自动删除app怎么关闭(iphone自动删除照片怎么回事情)

  • moa-al20是什么型号(moa-al20是什么型号手机多少钱)

    moa-al20是什么型号(moa-al20是什么型号手机多少钱)

  • 扫描件是什么意思(扫描件怎么搞)

    扫描件是什么意思(扫描件怎么搞)

  • win10全新启动是重装系统吗(win10全新启动是什么)

    win10全新启动是重装系统吗(win10全新启动是什么)

  • 华为mate30pro防水可以到达什么程度(华为mate30Pro防水吗)

    华为mate30pro防水可以到达什么程度(华为mate30Pro防水吗)

  • 华为10.0系统怎么降级(华为手机emui10系统)

    华为10.0系统怎么降级(华为手机emui10系统)

  • 华为mate30指纹解锁不灵敏(华为mate30指纹解锁屏幕闪烁)

    华为mate30指纹解锁不灵敏(华为mate30指纹解锁屏幕闪烁)

  • 退款包裹内纸条写什么(退款包裹内纸条怎么写)

    退款包裹内纸条写什么(退款包裹内纸条怎么写)

  • 小米9是屏幕指纹吗(小米9屏幕指纹校准失败)

    小米9是屏幕指纹吗(小米9屏幕指纹校准失败)

  • 华为子公司都有哪些(华为子公司有多少家)

    华为子公司都有哪些(华为子公司有多少家)

  • 华硕笔记本强制重启快捷键(华硕笔记本强制关机后开不了机怎么办)

    华硕笔记本强制重启快捷键(华硕笔记本强制关机后开不了机怎么办)

  • 1t固态硬盘有必要分区吗(1t固态硬盘有必要装吗)

    1t固态硬盘有必要分区吗(1t固态硬盘有必要装吗)

  • 台式电脑加内存条有什么用(台式电脑加内存条直接插上就行了吗)

    台式电脑加内存条有什么用(台式电脑加内存条直接插上就行了吗)

  • airpods指示灯说明(airpods指示灯闪烁是什么意思)

    airpods指示灯说明(airpods指示灯闪烁是什么意思)

  • word文档表格添加一行(word文档表格怎么添加一行)

    word文档表格添加一行(word文档表格怎么添加一行)

  • vivo手机设置双卡切换(vivo手机设置双卡在哪里)

    vivo手机设置双卡切换(vivo手机设置双卡在哪里)

  • 手机360兼容模式怎么设置(手机360兼容模式怎么打开)

    手机360兼容模式怎么设置(手机360兼容模式怎么打开)

  • word怎么删除框线(Word怎么删除框框)

    word怎么删除框线(Word怎么删除框框)

  • 网易云怎么找qq好友(网易云怎么找微信好友的账号)

    网易云怎么找qq好友(网易云怎么找微信好友的账号)

  • 一加手机主题怎么换(一加手机主题怎么混搭)

    一加手机主题怎么换(一加手机主题怎么混搭)

  • 苹果手机天气不准怎么调(苹果手机天气不准)

    苹果手机天气不准怎么调(苹果手机天气不准)

  • 蚂蚁森林6万步多少能量(蚂蚁森林18000步)

    蚂蚁森林6万步多少能量(蚂蚁森林18000步)

  • 查找我的iphone怎么添加设备(查找我的iphone怎么关)

    查找我的iphone怎么添加设备(查找我的iphone怎么关)

  • p30有没有红外线(x80有红外线功能吗)

    p30有没有红外线(x80有红外线功能吗)

  • sysctl命令  配置系统内核参数(sysctl命令配置主机名)

    sysctl命令 配置系统内核参数(sysctl命令配置主机名)

  • 收到所得税汇算退税计入补贴收入
  • 资本公积转增资本会引起什么变化
  • 个税退回怎么申请
  • 股票印花税是多少最新
  • 清算缴纳企业所得税
  • 海关缴款书有效期多久
  • 增值税专用发票和普通发票的区别
  • 企业所得税为什么那么高
  • 附加税减免吗
  • 企业国有资产无偿划转办法
  • 银行变更印鉴多久生效
  • 将产品转为本企业使用
  • 公司的利润怎样分配
  • 收到抵账车辆无发票
  • 报废资产处置收入怎么计税
  • 抵缴以前年度多缴所得税如何做会计分录?
  • 公司部分公积金计入什么科目
  • 全年一次性奖金计税方式
  • 佣金可以直接转到个人账户吗
  • 贴现的利息能不能取出来
  • 物流公司通行票抵税比例是多少
  • 蔬菜批发的利润怎么算
  • 重置申报清册是什么意思
  • 网络直播应如何缴纳增值税?
  • 代付给其他供应商货物尾款怎么记账
  • 累计结转是什么意思
  • 如何在Windows 11上卸载更新
  • 挖机所有权需要办理什么手续吗
  • 华硕s5am7700
  • win10自动关机方法
  • web投票系统源码
  • 如何在数据透视表中增加一行
  • 无产权买卖
  • 跨年租赁费如何处理
  • 新罕布什尔州的邮政编码
  • 什么情况下可以赔偿n+1
  • 微信小店api
  • 前端笔记软件
  • 什么是男人无力的行为
  • 微信网页授权管理在哪里
  • 跟踪数据包命令
  • 个体户怎么报增值税
  • 小规模的企业所得税怎么计算
  • ps橡皮擦工具的作用是什么
  • 技术转让和技术开发区别
  • 企业增值税专用发票抵扣流程
  • 一般纳税人直接不管会怎么样
  • 补充登记法的操作步骤
  • 收到设计费属于什么业务类型
  • 公司支票可以转给个人吗
  • 公司主要产品
  • 做好年底冲刺
  • 报销车辆通行费怎么做账
  • 母公司设立子公司协议
  • 企业银行存款的流动性强于存货
  • 电信线路租用费用
  • 来料加工的特点包括
  • 进口固定资产的汇率怎么算
  • 企业如何建账做账
  • 简述mysql的优势
  • Windows自带的游戏怎么删除
  • 屏幕右下角显示A2
  • win8系统怎么关闭自动更新系统
  • win8系统怎么安装微信
  • vc精华氧化变黄
  • mac笔记本如何设置不黑屏
  • Linux服务器架设指南百度网盘
  • cocos2dx怎么创建工程
  • 安卓网页开发工具
  • 纯js代码实现一进一出
  • css写文字
  • python matplotlab
  • Node.js中的包管理工具是什么
  • 安卓开发依赖文件添加在哪
  • jquery校验
  • js map(parseint)
  • Android StateMachine解析( 1 )
  • 个人所得税完税证明网上打印
  • 上海市个人所得税计算
  • 重庆市大学生田径锦标赛
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设