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.pswp.cn/diannao/39812.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39812.shtml
英文地址,請注明出處:http://en.pswp.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.…