elementui中table组件合并行(看就懂)

做一个动态合并的table表格, 如下图

1.首先定义需要合并的字段及合并后的对象
data(){return {mergeFields: ['name', 'amount3'],mergeObj: {}}
}
2.分配合并项函数, data为数据源
        //获取合并序号getSpanArr(data = []) {this.mergeFields.forEach(key => {// 用来记录合并行的起始位置let count = 0// 记录每一列的合并信息this.mergeObj[key] = []data.forEach((item, index) => {// 第一行直接 push 一个 1if (!index) {this.mergeObj[key].push(1)return}// 判断当前行是否与上一行其值相等 // 如果相等在count记录的位置其值+1 // 表示当前行需要合并 并添加一个 0 占位if (item[key] === data[index - 1][key]) {this.mergeObj[key][count] += 1this.mergeObj[key].push(0)return}// 如果当前行和上一行其值不相等 记录当前位置count = index // 重新push一个1this.mergeObj[key].push(1) })})},//合并行objectSpanMethod({ row, column, rowIndex, columnIndex }) {if (!this.mergeFields.includes(column.property)) return// 判断其值是不是为0if (this.mergeObj[column.property][rowIndex]) {return [this.mergeObj[column.property][rowIndex], 1]}// 如果为0则为需要合并的行return [0, 0]},
3.数据内容改变时函数
        //改变百分比触发changeVal(val, row, idx) {//找到一级相同项let alikeList = this.tableData.filter(it => it.name == row.name)//汇总let allPercent = alikeList.reduce((acc, curr) => {return acc + curr.amount2}, 0)//改变每一项let list = JSON.parse(JSON.stringify(this.tableData))list.forEach(it => {if (it.name == row.name) {it.amount3 = allPercent}})//先分配需要合并项this.getSpanArr(list)this.$nextTick(() => {this.tableData = JSON.parse(JSON.stringify(list))})}
4.完整代码

<template><div class="wokeRate"><el-table :data="tableData" :span-method="objectSpanMethod" :border="true" size="small"><el-table-column v-for="item in fields" :key="item.key" :prop="item.key" :label="item.label":width="item.width"><template slot-scope="scope"><div class="it" v-if="item.type == 'text'">{{ scope.row[item.key] }}</div><div class="it" v-if="item.type == 'input'"><el-input-number size="mini" v-model="scope.row[item.key]" :placeholder="`请输入${item.label}`"@change="e => changeVal(e, scope.row, scope.$index)"></el-input-number></div></template></el-table-column></el-table></div>
</template><script>
export default {name: 'DfcvDtmsVueWokeRate',data() {return {mergeFields: ['name', 'amount3'],mergeObj: {},tableData: [{name: '维保',amount1: '维保',amount2: 0,amount3: 0}, {name: '等待样品',amount1: '等待样机',amount2: 0,amount3: 0}, {name: '等待样品',amount1: '等待样件',amount2: 0,amount3: 0},{name: '无任务',amount1: '无任务',amount2: 0,amount3: 0}],fields: [{label: '一级',key: 'name',type: 'text'},{label: '二级',key: 'amount1',type: 'text'},{label: '百分比(%)',key: 'amount2',type: 'input'},{label: '汇总(%)',key: 'amount3',type: 'text'}]}},mounted() {this.getSpanArr(this.tableData)},methods: {//获取合并序号getSpanArr(data = []) {this.mergeFields.forEach(key => {// 用来记录需要合并行的起始位置let count = 0// 记录每一列的合并信息this.mergeObj[key] = []data.forEach((item, index) => {// 第一行直接 push 一个 1if (!index) {this.mergeObj[key].push(1)return}// 判断当前行是否与上一行其值相等 // 如果相等在count记录的位置其值+1 // 表示当前行需要合并 并添加一个 0 占位if (item[key] === data[index - 1][key]) {this.mergeObj[key][count] += 1this.mergeObj[key].push(0)return}// 如果当前行和上一行其值不相等 记录当前位置count = index// 重新push一个 1this.mergeObj[key].push(1)})})},//合并行objectSpanMethod({ row, column, rowIndex, columnIndex }) {if (!this.mergeFields.includes(column.property)) return// 判断其值是不是为0if (this.mergeObj[column.property][rowIndex]) {return [this.mergeObj[column.property][rowIndex], 1]}// 如果为0则为需要合并的行return [0, 0]},//改变百分比触发changeVal(val, row, idx) {//找到一级相同项let alikeList = this.tableData.filter(it => it.name == row.name)//汇总let allPercent = alikeList.reduce((acc, curr) => {return acc + curr.amount2}, 0)//改变每一项let list = JSON.parse(JSON.stringify(this.tableData))list.forEach(it => {if (it.name == row.name) {it.amount3 = allPercent}})//先分配需要合并项this.getSpanArr(list)this.$nextTick(() => {this.tableData = JSON.parse(JSON.stringify(list))})}}
}
</script><style lang="scss" scoped>
.wokeRate {width: 100%;padding: 20px 0;.el-table {margin-top: 20px;}
}
</style>
elementPlus一样使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/39812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据类型的分类和查看

数据类型是指定程序在运行过程中&#xff0c;将各种数据根据表示形式和组织形式划分为不同的分类。 例如&#xff0c;一个人的姓名可以用字符类型存储&#xff0c;年龄可以用数值类型存储&#xff0c;而婚否可以用布尔类型存储&#xff0c;这些都是 Python 中的 标准数据类型…

为什么我感觉 C 语言在 Linux 下执行效率比 Windows 快得多?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;Windows的终端或者叫控制台…

c++初级-2-引用

文章目录 引用一、引用的定义二、引用做函数参数三、引用作为返回对象四、引用的本质五、常量引用 引用 即给一个变量起别名。 一、引用的定义 int a 10;//引用int& b a;cout << "a " << a << endl;cout << "b " <&l…

时间12小时和24时转换方法

24小时时间转为12小时制 function convertTo12Hour(time24h){let [hours, minutes] time24h.split(:);let modifier 上午;if (parseInt(hours, 10) > 12) {modifier 下午;hours (parseInt(hours, 10) - 12).toString();}if (parseInt(hours, 10) 12) {modifier 下午;}…

新手入门:无服务器函数和FaaS简介

无服务器&#xff08;Serverless&#xff09;架构的价值在于其成本效益、弹性和扩展性、简化的开发和部署流程、高可用性和可靠性以及使开发者能够专注于业务逻辑。通过自动化资源调配和按需计费&#xff0c;无服务器架构能够降低成本并适应流量变化&#xff0c;同时简化开发流…

《昇思25天学习打卡营第01天|sun65535》

开始 昇思25天打卡训练营&#xff0c;让我第一次了解了华为昇思的平台&#xff0c;之前也有自己本地使用4060训练了一些“小模型”&#xff0c;但是都是比较皮毛的知识&#xff0c;只是根据教程去搭建。很少了解到具体的过程。昇思25天打卡训练营给了一个比较全面的训练课程。…

大数据基础知识【大数据导论】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 大数据基础知识前 必看 【大数据导论】—大数据序言…

Golang | Leetcode Golang题解之第206题反转链表

题目&#xff1a; 题解&#xff1a; func reverseList(head *ListNode) *ListNode {if head nil || head.Next nil {return head}newHead : reverseList(head.Next)head.Next.Next headhead.Next nilreturn newHead }

vue3基于uni-app 封装小程序request请求

const BASE_URL https://47.122.26.142; // 替换为你的 API 基础 URL const token uni.getStorageSync(token);const request (url: string, method: any, data {}, headers {}) > {return new Promise((resolve, reject) > {uni.request({url: ${BASE_URL}${url},m…

【1.1】动态规划求解不同的子序列

一、题目 给定一个字符串s和一个字符串t&#xff0c;计算在s的子序列中t出现的个数。 字符串的一个子序列是指&#xff0c;通过删除一些&#xff08;也可以不删除&#xff09;字符且不干扰剩余字符相对位置 所组成的新字符串。&#xff08;例如&#xff0c;"ACE"是…

6.2、函数的定义

代码 #include <iostream> using namespace std; #include <string>//函数定义//语法&#xff1a;//返回值类型 函数名(参数列表) {函数体语句 return表达式}//加法函数 int add(int num1, int num2) {int sum num1 num2;return sum; } int main() {cout <&l…

SpringBoot异步接口实现 提升吞吐量

前言 Servlet 3.0之前&#xff1a;HTTP请求由单一线程处理。Servlet 3.0之后&#xff1a;支持异步处理&#xff0c;提高系统吞吐量。 SpringBoot 异步接口实现方式 AsyncContext&#xff1a;Servlet层级&#xff0c;不常用。Callable&#xff1a;使用java.util.concurrent.C…

聊聊Redis持久化策略RDB

写在文章开头 为避免服务器宕机着情况导致redis内存数据库数据丢失&#xff0c;redis默认出通过rdb保证可靠性&#xff0c;本文将从源码的角度带读者了解rdb读写时机和写入流程。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff…

刷代码随想录有感(124):动态规划——最长公共子序列

题干&#xff1a; 代码&#xff1a; class Solution { public:int findLength(vector<int>& nums1, vector<int>& nums2) {vector<vector<int>>dp(nums1.size() 1, vector<int>(nums2.size() 1, 0));int res 0;for(int i 1; i <…

数据集采样策略对模型性能的影响问题

数据集采样策略对模型性能的影响问题&#xff0c;需要具体代码示例 随着机器学习和深度学习的快速发展&#xff0c;数据集的质量和规模对于模型性能的影响变得越来越重要。在实际应用中&#xff0c;我们往往面临着数据集规模过大、样本类别不平衡、样本噪声等问题。这时&#…

uni.showShareMenu({}) 和 uni.showShareImageMenu({}) 的区别

ChatGPT uni.showShareMenu({}) 和 uni.showShareImageMenu({}) 是 Uni-app 中两个不同的 API&#xff0c;它们的作用和用法有所不同&#xff1a; uni.showShareMenu({}) 作用&#xff1a;用于显示当前页面的分享菜单&#xff0c;通常显示在页面的右上角&#xff08;类似于微…

lnternet 发展史

一&#xff0c;lnternet 发展史 ARPA net &#xff08;上世纪50年代二战结束&#xff09; 无线 战场指挥通信协议落后 TCP/IP 包交换 WEB (70年代 ) 80年代 90年代 二&#xff0c;互联网的典型应用&#xff1a; 96年到2008年 第一代技术…

AJAX的概述 ,同步和异步的区别 ,AJAX 的交互模型和传统交互模型的区别

一. AJAX的概述 1.1 什么是ajax 同步&#xff1a; 异步&#xff1a; 1.AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 ​ 说明&#xff1a;异步&#xff1a;就是不同步。例如我们向后台发送请求&#xff0c;同步的方式是后台必…

日语笔记——jy

敬语尊敬自兼丁寧するされるいたすします先生が詳細に説明されるご説明いたします説明しますいうおっしゃる申す言うお名まえはなんとおっしゃいますかほかのことは申すまでもない親の言う事をよく聞く行くいらっしゃる参る行きます先生もいらっしゃるのですかご一緒に参りまし…

Node.js学习路线

Node.js是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;它允许JavaScript在服务器端运行。Node.js的核心内容和高阶内容涵盖了多个方面&#xff0c;以下是对Node.js的详细解析、核心内容以及高阶内容的归纳&#xff1a; 一、Node.js简介 运行环境&#xff1a;Node.…