Element Plus Table 組件擴展:表尾合計功能詳解

image

前言

??在現代數據驅動的社會中,數據分析和統計成為了非常重要的任務。為了更有效地分析數據和展示統計結果,前端開發人員可以使用Vue框架和Element Plus組件庫來實現數據的統計和分析功能。以下是一個關于如何在 Element Plus 的 el-table 組件中實現行匯總功能的文檔,這個示例將展示如何計算每行的特定列的總和并顯示在一個額外的匯總行中。

一、準備工作

安裝 Element Plus

??首先,確保已經安裝了 Element Plus。如果還沒有安裝,可以使用 npm 或 yarn 進行安裝:

npm install element-plus --save
# 或者使用 yarn yarn add element-plus

引入和注冊 Element Plus

??在 Vue 項目中,首先需要引入并注冊 Element Plus 的組件:

// main.js 或 main.ts
import { createApp } from 'vue';
import App from './App.vue';
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css';
const app = createApp(App);
app.use(ElementPlus);
app.mount('#app');

表尾合計功能實現

數據準備

??在進行數據的統計和分析之前,需要準備好相應的數據。可以從后端API獲取數據,也可以使用假數據。為了方便起見,我們在本文中使用假數據。

[{"id":"12987122","name":"王小虎","amount1":"234","amount2":"3.2","amount3":10},{"id":"12987123","name":"王小虎","amount1":"165","amount2":"4.43","amount3":12},{"id":"12987124","name":"王小虎","amount1":"324","amount2":"1.9","amount3":9},{"id":"12987125","name":"王小虎","amount1":"621","amount2":"2.2","amount3":17},{"id":"12987126","name":"王小虎","amount1":"539","amount2":"4.1","amount3":15}
]

基礎的表尾合計功能

??在使用Element Plus時,表格合計是一個常見的需求,通常用于在表格底部顯示某列或某幾列數據的總和。在Element Plus中,可以通過配置表格的列定義來實現合計行,它可以幫助我們快速對表格中的數據進行匯總和展示。在 Vue 中實現表格的表尾合計功能相當簡單,el-table通過添加 show-summary 屬性即可在表格底部顯示合計行,實現基礎表尾合計功能。這個功能默認是關閉的,需要顯式開啟。默認情況下,對于合計行,第一列不進行數據求合操作,而是顯示「合計」二字(可通過 sum-text 配置),其余列會將本列所有數值進行求合操作,并顯示出來。

<script setup lang="ts">
import { ElementPlus } from '@element-plus/icons-vue'
import { version as epVersion } from 'element-plus'
import { ref, version as vueVersion } from 'vue'const tableDataWithSummary = ref([{id: '12987122',name: '王小虎',amount1: '234',amount2: '3.2',amount3: 10},{id: '12987123',name: '王小虎',amount1: '165',amount2: '4.43',amount3: 12},{id: '12987124',name: '王小虎',amount1: '324',amount2: '1.9',amount3: 9},{id: '12987125',name: '王小虎',amount1: '621',amount2: '2.2',amount3: 17},{id: '12987126',name: '王小虎',amount1: '539',amount2: '4.1',amount3: 15}
]);</script><template><p><el-icon color="var(--el-color-primary)"><ElementPlus /></el-icon>Element Plus {{ epVersion }} + Vue {{ vueVersion }}</p><el-divider /><div><el-table :data="tableDataWithSummary" border style="width: 100%" show-summary><el-table-column prop="id" label="ID" width="180" /><el-table-column prop="name" label="姓名" /><el-table-column prop="amount1" sortable label="數值 1" /><el-table-column prop="amount2" sortable label="數值 2" /><el-table-column prop="amount3" sortable label="數值 3" /></el-table></div><div><el-table :data="tableDataWithSummary" border style="width: 100%" show-summary sum-text="總價"><el-table-column prop="id" label="ID" width="180" /><el-table-column prop="name" label="姓名" /><el-table-column prop="amount1" sortable label="數值 1" /><el-table-column prop="amount2" sortable label="數值 2" /><el-table-column prop="amount3" sortable label="數值 3" /></el-table></div>
</template>

image

進階的表尾合計功能

??我們已經成功實現了基礎的表尾合計功能,但業務需求可能更為復雜,例如,我們希望在合計金額上再加上特定的貨幣符號和百分比等。這時,我們可以利用summary-method這個屬性來定義自己的合計計算方法。這個屬性接受一個函數作為參數,其中包含了列信息和數據信息,然后該函數將用于計算并返回一個合計結果數組。

<script setup lang="ts">
import { ElementPlus } from '@element-plus/icons-vue'
import { version as epVersion } from 'element-plus'
import { ref, version as vueVersion } from 'vue'
import {VNode} from "vue";// 需要進行統計的列
const summaryColumns = ref(["amount1"])const tableDataWithSummary = ref([{id: '12987122',name: '王小虎',amount1: '234',amount2: '3.2',amount3: 10},{id: '12987123',name: '王小虎',amount1: '165',amount2: '4.43',amount3: 12},{id: '12987124',name: '王小虎',amount1: '324',amount2: '1.9',amount3: 9},{id: '12987125',name: '王小虎',amount1: '621',amount2: '2.2',amount3: 17},{id: '12987126',name: '王小虎',amount1: '539',amount2: '4.1',amount3: 15}
]);// 尾部計算合計
const getSummaries = (param: {columns: any[]; // 所有列的集合data: any[]; // 原始數據
}) => {const {columns, data} = param;const sums: ( number | string | VNode)[] = [];columns.forEach((column, index) => {// 第一列不進行求和操作,例如日期列或不需要的列,通用顯示文字'合計'或其他標識符,根據需要自定義。if (index === 0) {sums[index] = '合計';return;}// 最后一列通常是操作列,不進行求和操作,可以留空或者根據需要顯示文字。// if (index === columns.length - 1) {// sums[index] = '';// return;// }// 判斷遍歷的數據類型是否能轉換成數值類型,如果可以就表明值是 number類型,否則是string類型。判斷string類型是否是空字符串,為空字符換成0,不為空字符串就不做處理。const values = data.map((item) => !isNaN(Number(item[column.property])) ? !isNaN(parseFloat(item[column.property])) ? parseFloat(item[column.property]) : item[column.property] == '' ? 0 : item[column.property] : item[column.property]);// 一個空的結果數組,用來存放每一列的和let sum: any = null;//判斷數組中是否包含有string類型的值,并且是否能轉換成number類型(空字符串換成number類型為0)。如果不行,那就是說明包含了字符串類型的值。if (values.every(item => !isNaN(Number(item)))) {// 這是個遍歷數組的方法(用作累加器),第一個參數為回調函數,第二個參數為累加初始值。sum = values.reduce((total, currentValue) => {const value = Number(total);// 確定數據是否為空,不為空進行計算,為空返回原值if (!isNaN(value)) {return total + currentValue;} else {return total;}}, 0);} else {// 判斷是否為空,如果不為空就賦值sumvalues.map(item => {if (item != '') {sum = 0}})}if (summaryColumns.value.includes(column.property)) {sums[column.property] = sum;}});// 根據實際列順序返回 sums 數組return columns.map((_, index) =>index === 0 ? sums[0] : sums[columns[index].property] || "")
}
</script><template><p><el-icon color="var(--el-color-primary)"><ElementPlus /></el-icon>Element Plus {{ epVersion }} + Vue {{ vueVersion }}</p><el-divider /><div><el-table :data="tableDataWithSummary" border style="width: 100%" show-summary :summary-method="getSummaries"><el-table-column prop="id" label="ID" width="180" /><el-table-column prop="name" label="姓名" /><el-table-column prop="amount1" sortable label="數值 1" /><el-table-column prop="amount2" sortable label="數值 2" /><el-table-column prop="amount3" sortable label="數值 3" /></el-table></div>
</template>

??上段代碼的功能是對表格中的數據進行合計處理。首先,通過解構賦值從參數中獲取到columns和data,其中columns代表每列數據的屬性,通常在HTML中使用prop屬性進行綁定。然后,利用forEach方法遍歷每一列,對于每一列的數據,我們使用reduce()方法進行合計,并將結果存儲在sums數組中對應的位置。這樣,最終我們得到了一個包含各列合計結果的數組。
image

??需要注意的是,在實際的業務場景中,表格的數據可能涉及多頁,單頁計算可能并不足夠,后端通常需要生成專門的合計字段來進行處理,通過接口返回給前端,前端展示表尾合計行。

<script setup lang="ts">
import {ElementPlus} from '@element-plus/icons-vue'
import {version as epVersion} from 'element-plus'
import {ref, version as vueVersion} from 'vue'
import {TableColumnCtx} from "element-plus";
import {VNode} from "vue";const tableDataWithSummary = ref({tableData: [{id: '12987122', name: '王小虎', amount1: '234', amount2: '3.2', amount3: 10},{id: '12987123', name: '王小虎', amount1: '165', amount2: '4.43', amount3: 12},{id: '12987124', name: '王小虎', amount1: '324', amount2: '1.9', amount3: 9},{id: '12987125', name: '王小虎', amount1: '621', amount2: '2.2', amount3: 17},{id: '12987126', name: '王小虎', amount1: '539', amount2: '4.1', amount3: 15}], tableSum: {amount1Sum: 1883,amount2Sum: 15.83,amount3Sum: 63}
});interface UserInfo {id: string;name: string;amount1: string;amount2: string;amount3: number;
}interface SummaryMethodProps<T = UserInfo> {columns: TableColumnCtx<T>[] // 所有列的集合data: T[] // 原始數據
}// 尾部計算合計
const getSummaries = (param: SummaryMethodProps) => {const sums: (string | number | VNode)[] = [];param.columns.forEach((column, index) => {// 第一列不進行求和操作,例如日期列或不需要的列,通用顯示文字'合計'或其他標識符,根據需要自定義。if (index === 0) {sums[index] = '合計';return;}// 根據當前列綁定的字段名進行判斷,根據字段名決定展示什么內容switch (column.property) {case 'amount1':sums[index] = tableDataWithSummary.value.tableSum.amount1Sum;break;case 'amount2':sums[index] = tableDataWithSummary.value.tableSum.amount2Sum;break;case 'amount3':sums[index] = tableDataWithSummary.value.tableSum.amount3Sum;break;default:sums[index] = '';break;}});// 根據實際列順序返回 sums 數組return param.columns.map((_, index) =>index === 0 ? sums[0] : sums[index] || '')
}
</script><template><p><el-icon color="var(--el-color-primary)"><ElementPlus /></el-icon>Element Plus {{ epVersion }} + Vue {{ vueVersion }}</p><el-divider /><div><el-table :data="tableDataWithSummary.tableData" style="width: 100%" show-summary :summary-method="getSummaries"><el-table-column prop="id" label="ID" width="180" /><el-table-column prop="name" label="姓名" /><el-table-column prop="amount1" sortable label="數值 1" /><el-table-column prop="amount2" sortable label="數值 2" /><el-table-column prop="amount3" sortable label="數值 3" /></el-table></div>
</template>

image

小結

??使用Vue和Element Plus可以方便地實現數據的統計功能。在本文中,我們介紹了如何展示數據、統計數據,并提供了相關的代碼示例。在實際項目中,可以根據具體需求進一步擴展和優化該組件。

image

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92392.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92392.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92392.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

神經網絡 非線性激活層 正則化層 線性層

神經網絡 非線性激活層 作用&#xff1a;增強模型的非線性擬合能力 非線性激活層網絡&#xff1a; class activateNet(nn.Module):def __init__(self):super(activateNet,self).__init__()self.relu nn.ReLU()self.sigmoid nn.Sigmoid()def forward(self,input):#output sel…

【Vue進階學習筆記】組件通信專題精講

目錄前言props 父傳子原理說明使用場景代碼示例父組件 PropsTest.vue子組件 Child.vue自定義事件 $emit 子傳父原理說明使用場景代碼示例父組件 EventTest.vue子組件 Event2.vueEvent Bus 兄弟/跨層通信原理說明使用場景代碼示例事件總線 bus/index.ts兄弟組件通信示例Child2.v…

【PTA數據結構 | C語言版】求最小生成樹的Prim算法

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;實現在帶權的無向圖中求最小生成樹的 Prim 算法。 注意&#xff1a;當多個待收錄頂點到當前點集的距離等長時&#xff0c;按編號升序進行收錄。 輸入格式&#xff1a; 輸入首…

【加解密與C】Rot系列(四)RotSpecial

RotSpecial 函數解析RotSpecial 是一個自定義函數&#xff0c;通常用于處理特定的旋轉操作&#xff0c;尤其在圖形變換或數據處理中。該函數可能涉及歐拉角、四元數或其他旋轉表示方法&#xff0c;具體行為取決于實現上下文。以下是關于該函數的通用解釋和可能的使用方法&#…

【機器學習深度學習】LLaMAFactory中的精度訓練選擇——bf16、fp16、fp32與pure_bf16深度解析

目錄 前言 一、 為什么精度如此重要&#xff1f;—— 內存、速度與穩定性的三角博弈 二、 四大精度/模式詳解&#xff1a; bf16, fp16, fp32, pure_bf16 三、 關鍵特性對比表 ▲四大計算類型核心對比表 ▲ 顯存占用對比示例&#xff08;175B參數模型&#xff09; ▲LLa…

C# 基于halcon的視覺工作流-章21-點查找

C# 基于halcon的視覺工作流-章21-點查找 本章目標&#xff1a; 一、檢測顯著點&#xff1b; 二、Harris檢測興趣點&#xff1b; 三、Harris二項式檢測興趣點&#xff1b; 四、Sojka運算符檢測角點&#xff1b; 五、Lepetit算子檢測興趣點&#xff1b;一、檢測顯著點 halcon算子…

(11)機器學習小白入門YOLOv:YOLOv8-cls epochs與數據量的關系

YOLOv8-cls epochs與數據量的關系 (1)機器學習小白入門YOLOv &#xff1a;從概念到實踐 (2)機器學習小白入門 YOLOv&#xff1a;從模塊優化到工程部署 (3)機器學習小白入門 YOLOv&#xff1a; 解鎖圖片分類新技能 (4)機器學習小白入門YOLOv &#xff1a;圖片標注實操手冊 (5)機…

Grafana | 如何將 11.x 升級快速到最新 12.x 版本?

[ 知識是人生的燈塔&#xff0c;只有不斷學習&#xff0c;才能照亮前行的道路 ]&#x1f4e2; 大家好&#xff0c;我是 WeiyiGeek&#xff0c;一名深耕安全運維開發&#xff08;SecOpsDev&#xff09;領域的技術從業者&#xff0c;致力于探索DevOps與安全的融合&#xff08;Dev…

Dubbo + Spring Boot + Zookeeper 快速搭建分布式服務

Dubbo Spring Boot Zookeeper 快速搭建分布式服務 本文將詳細介紹如何基于 Dubbo、Spring Boot 和 Zookeeper 快速搭建一個簡單的分布式服務調用場景&#xff0c;包含服務提供者&#xff08;Provider&#xff09;、服務消費者&#xff08;Consumer&#xff09;及公共接口&…

五分鐘掌握 TDengine 數據文件的工作原理

小 T 導讀&#xff1a;今天我們來探討一下——TDengine中的時序數據到底是如何存儲的&#xff1f; 在上一期的文章《五分鐘掌握 TDengine 時序數據的保留策略》中&#xff0c;我們知道了TDengine是如何按照時間段對數據進行分區來管理數據的。 接下來&#xff0c;我們和大家一起…

Python爬蟲實戰:研究http-parser庫相關技術

一、研究背景與意義 在當今數字化時代,網絡數據蘊含著巨大的價值。從商業決策、學術研究到社會治理,對海量網絡信息的有效采集與分析至關重要。網絡爬蟲作為數據獲取的核心工具,其性能與穩定性直接影響數據質量。然而,隨著互聯網技術的發展,網站反爬機制不斷升級,傳統爬…

Go語言實戰案例-批量重命名文件

在《Go語言100個實戰案例》中的 文件與IO操作篇 - 案例17&#xff1a;批量重命名文件 的完整內容&#xff0c;適合初學者實踐如何使用 Go 操作文件系統并批量處理文件名。&#x1f3af; 案例目標實現一個小工具&#xff0c;能夠批量重命名指定目錄下的所有文件&#xff0c;例如…

基于單片機非接觸紅外測溫系統

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 本設計實現了一種基于單片機的非接觸式紅外測溫系統&#xff0c;適用于快速、安全測量物體表面溫…

Python 入門手札:從 0 到會--第十天Python常用的第三方庫Numpy,Pandas,Matplotlib

目錄 一、Numpy 1.NumPy 是什么&#xff1f; 1.1安裝numpy 1.2 導入numpy模塊 2.NumPy 的核心&#xff1a;ndarray 2.1 什么是 ndarray&#xff1f; 2.2 ndarray 的創建方式 2.3 常見屬性&#xff08;用于查看數組結構&#xff09; 2.4 ndarray 的切片與索引 2.5 ndarr…

mysql 性能優化之Explain講解

EXPLAIN是 MySQL 中用于分析查詢執行計劃的重要工具&#xff0c;通過它可以查看查詢如何使用索引、掃描數據的方式以及表連接順序等信息&#xff0c;從而找出性能瓶頸。以下是關于EXPLAIN的詳細介紹和實戰指南&#xff1a;1. EXPLAIN 基本用法在SELECT、INSERT、UPDATE、DELETE…

Redis 連接:深度解析與最佳實踐

Redis 連接:深度解析與最佳實踐 引言 Redis 作為一款高性能的內存數據結構存儲系統,在當今的互聯網應用中扮演著越來越重要的角色。高效的 Redis 連接管理對于保證系統的穩定性和性能至關重要。本文將深入探討 Redis 連接的原理、配置以及最佳實踐,幫助讀者更好地理解和應…

C語言---VSCODE的C語言環境搭建

文章目錄資源下載配置環境驗證資源下載 站內下載 配置環境 解壓壓縮包&#xff0c;復制以下文件的路徑 打開主頁搜索系統環境變量 點擊環境變量 選擇系統變量中的Path&#xff0c;點擊編輯 在最后面添加路徑。 添加完成記得關機重啟。 驗證 重啟電腦之后打開在Power…

ojdbc對應jdk版本附下載地址(截止20250722)

可以從Oracle官網查看&#xff0c; JDBC and UCP Downloads page

Redis為什么被設計成是單線程的?

Redis單線程模型解析 當我們說Redis是單線程時,特指"其網絡IO和鍵值對讀寫操作由單個線程完成"。實際上,Redis僅網絡請求模塊和數據操作模塊采用單線程設計,而持久化存儲、集群支持等其他模塊都采用了多線程架構。 事實上,Redis從4.0版本就開始對部分命令實現了…

基礎流程圖

一、常用符號及定義二、 畫圖基礎規則1、從上至下&#xff0c;從左至右流向順序。2、開始符號只能有一個出口。3、進程符號不做校驗邏輯。4、相同流程圖&#xff0c;符號大小應為一致。5、引用流程&#xff0c;不重復繪制。6、路徑符號盡量避免交叉重疊。7、同一路徑&#xff0…