Vue使用vxe-table實(shí)現(xiàn)數(shù)據(jù)分組統(tǒng)計(jì)與表尾合計(jì)
在數(shù)據(jù)報(bào)表或管理系統(tǒng)中,經(jīng)常需要按某個(gè)字段對(duì)數(shù)據(jù)進(jìn)行分組,并計(jì)算每組的統(tǒng)計(jì)值(如求和、平均值),同時(shí)在表格底部顯示所有數(shù)據(jù)的合計(jì)。vxe-table 提供了靈活的聚合配置 aggregateConfig 和自定義計(jì)算函數(shù) calcValuesMethod,配合手動(dòng)表尾 footerData,可以輕松實(shí)現(xiàn)這類需求。
本文將通過(guò)一個(gè)完整的示例,演示如何按角色(role)對(duì)數(shù)據(jù)進(jìn)行分組,統(tǒng)計(jì)每個(gè)角色的 num 字段總和,并在表格尾部顯示所有數(shù)據(jù)的 num 總計(jì)。
屬性說(shuō)明
| 配置項(xiàng) / 屬性 | 所在位置 | 作用 |
|---|---|---|
| aggregateConfig.groupFields | 表格配置(gridOptions) | 指定分組字段,例如 ['role'],表格會(huì)按該字段對(duì)數(shù)據(jù)進(jìn)行分組,并在每個(gè)分組后插入“分組合計(jì)行” |
| aggregateConfig.calcValuesMethod | 表格配置 | 自定義分組統(tǒng)計(jì)值計(jì)算函數(shù),接收當(dāng)前分組的子數(shù)據(jù)(children)和列信息(column),返回統(tǒng)計(jì)值 |
| aggFunc | 列配置(columns) | 標(biāo)記該列需要參與聚合計(jì)算,配合分組統(tǒng)計(jì)使用 |
| footerData | 表格配置 | 手動(dòng)指定表尾合計(jì)行的數(shù)據(jù),適用于簡(jiǎn)單的總計(jì)、平均值等,更復(fù)雜時(shí)可配合 updateFooter 方法動(dòng)態(tài)計(jì)算 |
| rowGroupNode | 列配置 | 標(biāo)識(shí)該列作為分組的顯示節(jié)點(diǎn),通常設(shè)置為 true,使分組后的行可以展開/折疊(示例中使用) |
分組聚合需要同時(shí)設(shè)置 aggregateConfig.groupFields 和至少一列的 rowGroupNode: true,同時(shí)要聚合的列必須設(shè)置 aggFunc: true(或自定義聚合函數(shù))。
代碼

<template>
<div>
<vxe-grid v-bind="gridOptions"></vxe-grid>
</div>
</template>
<script setup>
import { reactive } from 'vue'
// 表尾合計(jì)行數(shù)據(jù)(手動(dòng)維護(hù)總計(jì))
const footerSummaryRow = reactive({
seq: '總計(jì)',
num: 0
})
const gridOptions = reactive({
border: true,
showOverflow: true, // 超出顯示省略號(hào)
showFooter: true, // 開啟表尾
height: 500,
loading: false,
// 分組聚合配置
aggregateConfig: {
groupFields: ['role'], // 按角色字段分組
// 自定義分組統(tǒng)計(jì)值的計(jì)算方法
calcValuesMethod({ column, children }) {
// 只對(duì) num 列進(jìn)行求和
if (column.field === 'num') {
let sum = 0
children.forEach(item => {
sum += item.num
})
return sum
}
// 其他列不統(tǒng)計(jì),返回 0 或空字符串
return 0
}
},
// 列定義
columns: [
{ type: 'seq', width: 70, title: '序號(hào)' },
{ field: 'name', title: '姓名', minWidth: 150, rowGroupNode: true }, // 分組顯示節(jié)點(diǎn)
{ field: 'role', title: '角色', width: 120 },
{ field: 'num', title: '數(shù)量', width: 100, aggFunc: true }, // 參與聚合
{ field: 'age', title: '年齡', width: 80 },
{ field: 'address', title: '地址', minWidth: 200 }
],
data: [], // 動(dòng)態(tài)加載的數(shù)據(jù)
footerData: [footerSummaryRow] // 表尾數(shù)據(jù)
})
// 模擬異步加載數(shù)據(jù),并計(jì)算表尾總計(jì)
const loadData = () => {
gridOptions.loading = true
setTimeout(() => {
const rawData = [
{ id: 10001, name: 'Test1', role: 'Develop', sex: 'Woman', age: 28, num: 63, date: '2025-02-01', address: 'test abc' },
{ id: 10002, name: 'Test2', role: 'Test', sex: 'Man', age: 22, num: 63, date: '2025-01-01', address: 'Guangzhou' },
{ id: 10003, name: 'Test3', role: 'PM', sex: 'Woman', age: 32, num: 10, date: '2025-05-01', address: 'Shanghai' },
{ id: 10004, name: 'Test4', role: 'Designer', sex: 'Man', age: 32, num: 24, date: '2025-01-01', address: 'test abc' },
{ id: 10005, name: 'Test5', role: 'Develop', sex: 'Man', age: 30, num: 98, date: '2025-01-01', address: 'Shanghai' },
{ id: 10006, name: 'Test6', role: 'Designer', sex: 'Man', age: 30, num: 46, date: '2025-03-01', address: 'test abc' },
{ id: 10007, name: 'Test7', role: 'Test', sex: 'Woman', age: 29, num: 35, date: '2025-05-01', address: 'test abc' },
{ id: 10008, name: 'Test8', role: 'PM', sex: 'Woman', age: 35, num: 84, date: '2025-11-01', address: 'test abc' },
{ id: 10009, name: 'Test9', role: 'Test', sex: 'Man', age: 21, num: 25, date: '2025-05-01', address: 'test abc' },
{ id: 10010, name: 'Test10', role: 'PM', sex: 'Woman', age: 28, num: 32, date: '2025-03-01', address: 'test abc' },
{ id: 10011, name: 'Test11', role: 'Test', sex: 'Woman', age: 29, num: 24, date: '2025-03-01', address: 'test abc' },
{ id: 10012, name: 'Test12', role: 'Develop', sex: 'Man', age: 37, num: 28, date: '2025-10-01', address: 'test abc' },
{ id: 10013, name: 'Test13', role: 'Test', sex: 'Woman', age: 24, num: 38, date: '2025-02-01', address: 'test abc' },
{ id: 10014, name: 'Test14', role: 'Develop', sex: 'Man', age: 34, num: 46, date: '2025-08-01', address: 'test abc' },
{ id: 10015, name: 'Test15', role: 'Designer', sex: 'Man', age: 21, num: 48, date: '2025-05-01', address: 'test abc' },
{ id: 10016, name: 'Test16', role: 'Designer', sex: 'Woman', age: 21, num: 59, date: '2025-10-01', address: 'test abc' },
{ id: 10017, name: 'Test17', role: 'Test', sex: 'Man', age: 31, num: 81, date: '2025-12-01', address: 'test abc' },
{ id: 10018, name: 'Test18', role: 'Develop', sex: 'Woman', age: 32, num: 75, date: '2025-10-01', address: 'test abc' },
{ id: 10019, name: 'Test19', role: 'Test', sex: 'Man', age: 37, num: 80, date: '2025-02-01', address: 'test abc' },
{ id: 10020, name: 'Test20', role: 'Develop', sex: 'Man', age: 41, num: 60, date: '2025-03-01', address: 'test abc' }
]
// 計(jì)算總計(jì)(num 總和)
let totalNum = 0
rawData.forEach(row => {
totalNum += row.num
})
footerSummaryRow.num = totalNum
gridOptions.data = rawData
gridOptions.loading = false
}, 200)
}
// 調(diào)用加載
loadData()
</script>實(shí)現(xiàn)思路
- 分組顯示:表格會(huì)按 role 字段將數(shù)據(jù)分組,同一角色的數(shù)據(jù)連續(xù)排列,并在每個(gè)分組前顯示一個(gè)可展開/折疊的分組行(分組標(biāo)題行)。
- 分組統(tǒng)計(jì)行:在每個(gè)分組的末尾,自動(dòng)插入一行“分組合計(jì)”,其中 num 列顯示該組內(nèi)所有 num 值的總和(由 * calcValuesMethod 自定義計(jì)算)。 表尾總計(jì):表格底部固定一行(footerData),顯示所有數(shù)據(jù)的 num 總計(jì)。該總計(jì)需要手動(dòng)從數(shù)據(jù)源計(jì)算并賦值。
vxe-table 通過(guò) aggregateConfig 和 aggFunc 提供了強(qiáng)大的分組聚合能力,結(jié)合自定義計(jì)算函數(shù) calcValuesMethod 可以滿足任意復(fù)雜的統(tǒng)計(jì)需求。而表尾合計(jì)通過(guò) footerData 手動(dòng)維護(hù),靈活直觀。兩者配合使用,能夠快速搭建具有分組統(tǒng)計(jì)和總計(jì)功能的專業(yè)數(shù)據(jù)表格。
到此這篇關(guān)于Vue使用vxe-table實(shí)現(xiàn)數(shù)據(jù)分組統(tǒng)計(jì)與表尾合計(jì)的文章就介紹到這了,更多相關(guān)Vue vxe-table數(shù)據(jù)分組統(tǒng)計(jì)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue-resource?獲取本地json數(shù)據(jù)404問題的解決
這篇文章主要介紹了vue-resource?獲取本地json數(shù)據(jù)404問題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
Vite?Vue3?EsLint?Prettier配置步驟極簡(jiǎn)方法詳解
這篇文章主要為大家介紹了Vite?Vue3?EsLint?Prettier配置步驟的極簡(jiǎn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Vue中組件(Component)和插件(Plugin)的區(qū)別及說(shuō)明
這篇文章主要介紹了Vue中組件(Component)和插件(Plugin)的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
vue項(xiàng)目打包時(shí)自動(dòng)更新版本號(hào)的實(shí)現(xiàn)方法
本文主要介紹了vue項(xiàng)目打包時(shí)自動(dòng)更新版本號(hào)的實(shí)現(xiàn)方法,通過(guò)在根目錄下創(chuàng)建autoVersion.js腳本文件,頁(yè)面獲取版本號(hào)時(shí)直接使用,修改package.json配置,感興趣的可以了解一下2025-02-02
vue使用axios實(shí)現(xiàn)excel文件下載的功能
這篇文章主要介紹了vue中使用axios實(shí)現(xiàn)excel文件下載的功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
vue前端框架—Mint UI詳解(更適用于移動(dòng)端)
這篇文章主要介紹了vue前端框架—Mint UI的詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Vue3-KeepAlive,多個(gè)頁(yè)面使用keepalive方式
這篇文章主要介紹了Vue3-KeepAlive,多個(gè)頁(yè)面使用keepalive方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08

