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

  • 华为nova10返回键在哪(华为nova10返回键怎么调出来)

    华为nova10返回键在哪(华为nova10返回键怎么调出来)

  • 纽曼蓝牙耳机怎么配对(纽曼蓝牙耳机怎么重置)

    纽曼蓝牙耳机怎么配对(纽曼蓝牙耳机怎么重置)

  • 小米路由器管理密码在哪里看(小米路由器管理页面)

    小米路由器管理密码在哪里看(小米路由器管理页面)

  • 淘宝评价多久清空一次(淘宝评价多久会清零)

    淘宝评价多久清空一次(淘宝评价多久会清零)

  • 微信按住说话需要设置吗(微信按住说话需要流量吗)

    微信按住说话需要设置吗(微信按住说话需要流量吗)

  • 快手怎么禁止别人下载(快手怎么禁止别人发弹幕)

    快手怎么禁止别人下载(快手怎么禁止别人发弹幕)

  • 电脑右下角白屏一小块(电脑右下显示白块)

    电脑右下角白屏一小块(电脑右下显示白块)

  • 小米8人脸识别失灵(小米8人脸识别模块坏了)

    小米8人脸识别失灵(小米8人脸识别模块坏了)

  • nova7有没有红外线(nova7有没有红外线功能)

    nova7有没有红外线(nova7有没有红外线功能)

  • qq显示离开对方在干嘛(qq对某人显示离开)

    qq显示离开对方在干嘛(qq对某人显示离开)

  • 苹果8p怎么用耳机听歌(苹果8P怎么用耳机转换头没反应)

    苹果8p怎么用耳机听歌(苹果8P怎么用耳机转换头没反应)

  • 快手礼物幸运魔盒主播能收到吗(快手礼物幸运魔盒多少快币)

    快手礼物幸运魔盒主播能收到吗(快手礼物幸运魔盒多少快币)

  • pms系统是什么意思

    pms系统是什么意思

  • i7 7700hq配什么显卡(i7-7700配什么显卡)

    i7 7700hq配什么显卡(i7-7700配什么显卡)

  • bd和hd哪个清晰度高(hd和bd哪个清晰度高)

    bd和hd哪个清晰度高(hd和bd哪个清晰度高)

  • 苹果手机主板坏了,里面的资料能取出来吗(苹果手机主板坏了怎么办)

    苹果手机主板坏了,里面的资料能取出来吗(苹果手机主板坏了怎么办)

  • 怎样减少字符间距(如何减少字符间距)

    怎样减少字符间距(如何减少字符间距)

  • apple pencil怎么看电量(apple pencil怎么看充电状态)

    apple pencil怎么看电量(apple pencil怎么看充电状态)

  • ipad用安卓耳机吗(ipad2020安卓耳机)

    ipad用安卓耳机吗(ipad2020安卓耳机)

  • 抖音视频如何调全屏(抖音视频如何调整播放速度)

    抖音视频如何调全屏(抖音视频如何调整播放速度)

  • 苹果手机无法载入照片怎么办(苹果手机无法载入高质量的照片是怎么回事)

    苹果手机无法载入照片怎么办(苹果手机无法载入高质量的照片是怎么回事)

  • 一个手机号注册了两个微信怎么找回第一个(一个手机号注册2个微信另一个不见了)

    一个手机号注册了两个微信怎么找回第一个(一个手机号注册2个微信另一个不见了)

  • 苹果8p特殊功能介绍(iphone8特殊功能)

    苹果8p特殊功能介绍(iphone8特殊功能)

  • 苹果x有4.7寸的吗(iphonex有4.7英寸的吗)

    苹果x有4.7寸的吗(iphonex有4.7英寸的吗)

  • 抖音怎么制作长视频(抖音怎么制作长图)

    抖音怎么制作长视频(抖音怎么制作长图)

  • 华为分享是什么意思详情(华为分享是什么意思关闭有影响吗)

    华为分享是什么意思详情(华为分享是什么意思关闭有影响吗)

  • 机器维修费属于变动成本吗
  • 发票章没盖在盖章处
  • 知道税额怎么算含税金额
  • 收到转账支票怎么去银行处理
  • 记账凭证上的摘要每行都要写吗
  • 指定会计科目是
  • 预收账款本期发生额怎么算
  • 现金流量表上的期末现金余额等于___
  • 企业月奖金发放制度
  • 分派现金股利会计科目
  • 税务分析最常用的分析方法
  • 企业备用金用途
  • 每股股份价格
  • 计提个人负担的社会保险费分录
  • 只有发票才能税前扣除吗
  • 地方教育费附加的会计分录
  • 境外取得收入要不要交企业所得税
  • 收取赔偿金开具什么发票
  • 苹果电脑重装系统无法连接服务器
  • 生产性企业购买粽子可以开专票吗
  • 纳税调整需要调年度报表嘛
  • uniapp关闭当前页面
  • 公司向股东还款的会计分录
  • 租用办公设备
  • 盈余公积减少记哪方
  • 使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
  • 一点分享案例
  • 蓝色龙舌兰花语
  • android常用的集成开发工具有
  • 企业和银行未达账项
  • php shell_exec()
  • 美国人用什么英语词典
  • 林场苗圃工作有哪些
  • 资产减值损失账户核算内容
  • curl抓包
  • 已经抵扣的发票红字信息表怎么开
  • 资产处置损益是当期损益吗
  • 纳税人按照月度或者季度的实际利润额预缴有困难的
  • 转租行为的税务处理方法
  • 研发费用加计扣除新税收政策2023
  • 增值税发票联次及其作用
  • 用于不动产的进项税额
  • 在建工程发生的运费计入什么科目
  • 企业代扣税费会计分录
  • 小规模开具的1%专票 一般纳税人抵扣
  • 挂靠地址如果被查了应该怎么处理?
  • 间接费用的分配公式
  • 非营利机构如何申请
  • 蔬菜公司开具专票可以抵扣吗
  • 自产产品与视同自产产品
  • 发票专用章需要备案吗?
  • 车间管理人员工资属于间接费用吗
  • 购建时间是什么意思
  • 实用的银行转账怎么转
  • sql语句编译执行过程
  • 用SQL统计SQLServe表存储空间大小的代码
  • MySQL 5.7双主同步部分表的实现过程详解
  • 便签windows
  • ubuntu下的vivado2022怎么打开
  • qtask.exe - qtask是什么进程 有什么用
  • yum源有什么用
  • 什么时候用热毛巾敷眼睛最好
  • 批量dns解析
  • shell的变量分为哪三种
  • linux shell命令的返回值
  • 防止sql注入php
  • jquery日历框有长期的选项
  • js实现简单排列的方法
  • 使用灭火器人要站在上风口还是下风口
  • python文件文件夹操作
  • javascript面向对象编程指南第三版
  • h5实现微信分享
  • 电子税务局季度利润表本月数
  • 全国大学生数学竞赛证书电子版查询
  • 河南12306区号
  • 智行火车票电子报销凭证
  • 广东税务app下载安装
  • 车辆购置税完税证明怎么查询
  • 严守纪律守规矩
  • 上海税务局发票验旧
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设