ElementUI對(duì)table的指定列進(jìn)行合算
前言
最近有一個(gè)想法,就是記錄自己花銷的時(shí)候,table中有一項(xiàng)內(nèi)容是花銷的金額。然后想在table的底部有一項(xiàng)內(nèi)容是該金額的總計(jì)。
然后我就順著elementui的table組件尋找相關(guān)的demo,還真發(fā)現(xiàn)了一個(gè)這樣的demo。

對(duì)于這個(gè)demo,官方是這么描述的:
將show-summary設(shè)置為true就會(huì)在表格尾部展示合計(jì)行。默認(rèn)情況下,對(duì)于合計(jì)行,第一列不進(jìn)行數(shù)據(jù)求合操作,而是顯示「合計(jì)」二字(可通過(guò)sum-text配置),其余列會(huì)將本列所有數(shù)值進(jìn)行求合操作,并顯示出來(lái)。當(dāng)然,你也可以定義自己的合計(jì)邏輯。使用summary-method并傳入一個(gè)方法,返回一個(gè)數(shù)組,這個(gè)數(shù)組中的各項(xiàng)就會(huì)顯示在合計(jì)行的各列中,具體可以參考本例中的第二個(gè)表格。
通過(guò)描述可以發(fā)現(xiàn)幾個(gè)要點(diǎn):
1.可以通過(guò)show-summary開(kāi)啟在表格尾部展示合計(jì)行,默認(rèn)是false,改成true即可開(kāi)啟,第一列不進(jìn)行數(shù)據(jù)求合操作。
2.尾部合計(jì)的文案默認(rèn)是合計(jì),可以通過(guò)sum-text自定義修改
3.可以通過(guò)summary-method編寫(xiě)一個(gè)函數(shù),自定義合計(jì)的邏輯

官方的原生代碼如下:
<template>
<el-table
:data="tableData"
border
show-summary
style="width: 100%">
<el-table-column
prop="id"
label="ID"
width="180">
</el-table-column>
<el-table-column
prop="name"
label="姓名">
</el-table-column>
<el-table-column
prop="amount1"
sortable
label="數(shù)值 1">
</el-table-column>
<el-table-column
prop="amount2"
sortable
label="數(shù)值 2">
</el-table-column>
<el-table-column
prop="amount3"
sortable
label="數(shù)值 3">
</el-table-column>
</el-table>
<el-table
:data="tableData"
border
height="200"
:summary-method="getSummaries"
show-summary
style="width: 100%; margin-top: 20px">
<el-table-column
prop="id"
label="ID"
width="180">
</el-table-column>
<el-table-column
prop="name"
label="姓名">
</el-table-column>
<el-table-column
prop="amount1"
label="數(shù)值 1(元)">
</el-table-column>
<el-table-column
prop="amount2"
label="數(shù)值 2(元)">
</el-table-column>
<el-table-column
prop="amount3"
label="數(shù)值 3(元)">
</el-table-column>
</el-table>
</template>
<script>
export default {
data() {
return {
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
}]
};
},
methods: {
getSummaries(param) {
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '總價(jià)';
return;
}
const values = data.map(item => Number(item[column.property]));
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
sums[index] += ' 元';
} else {
sums[index] = 'N/A';
}
});
return sums;
}
}
};
</script>
接下來(lái)就改造下代碼,根據(jù)自己的需求去修改對(duì)應(yīng)的邏輯。
show-summary合計(jì)項(xiàng)初始化
首先把相關(guān)的代碼加上,初始化就是這樣的一個(gè)效果


sum-tex修改文案
但是默認(rèn)的文案是合計(jì),有時(shí)候我們可能需要根據(jù)自己的場(chǎng)景進(jìn)行修改
這時(shí)候就可以使用sum-tex屬性進(jìn)行修改了,比如我這里修改:
sum-text="總共消費(fèi)

效果馬上就來(lái)

但是這時(shí)候還有一個(gè)問(wèn)題,我只想要消費(fèi)金額這一列進(jìn)行匯總,但是現(xiàn)在的情況是把table全部的列都匯總了。甚至把我的字典值都匯總了。。。
這顯然不符合我的需求,這時(shí)候就可以使用自定義函數(shù)了。

summary-method自定義函數(shù)
和前面兩個(gè)屬性一樣,直接加在table中即可。由于它的值是一個(gè)函數(shù),所以寫(xiě)法和前兩位略有不同。


我們也可以再這個(gè)函數(shù)里面通過(guò) sums[index] 去定義總價(jià)的文案,如果sum-text和函數(shù)里面定義的 sums[index] 有沖突,會(huì)以函數(shù)中的 sums[index] 文案為主

這時(shí)候的效果是這樣的。

自定義總計(jì)列
單個(gè)列
如果我們只想要對(duì)某一列進(jìn)行總計(jì),那么可以借助column的property屬性:

可以發(fā)現(xiàn)其實(shí)就是全部的屬性名稱,那么我們就可以根據(jù)它判斷,實(shí)現(xiàn)自定義核算了

比如這里我想要核算amount這一列的值:


多個(gè)列
如果哪天又加了一個(gè)需求,需要再算一個(gè)列,這時(shí)候在判斷里面加上這個(gè)條件即可。使用|| 拼接該列
比如這里我又要合算remark這一列。就可以這么寫(xiě):


相關(guān)代碼如下:
<el-table
:data="moneyTableData.slice((currentPage-1)*pagesize,currentPage*pagesize)"
highlight-current-row
border
stripe
fit
show-summary
sum-text="總共消費(fèi)"
:summary-method="getSummaries"
>
// 對(duì)列進(jìn)行合算
getSummaries(param) {
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '總共消費(fèi)';
return;
}
const values = data.map(item => Number(item[column.property]));
// 只對(duì)amount這一列進(jìn)行總計(jì)核算。
if (column.property === 'amount') {
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
}else {
return prev;
}
}, 0);
sums[index] += ' 元';
} else {
sums[index] = '---'
}
}
});
return sums;
},
總結(jié)
ElemenUI對(duì)這個(gè)demo封裝的特別好,我們直接拿來(lái)用修改下自己的邏輯即可。
到此這篇關(guān)于ElementUI對(duì)table的指定列進(jìn)行合算的文章就介紹到這了,更多相關(guān)Element table指定列合算內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解基于Vue/React項(xiàng)目的移動(dòng)端適配方案
這篇文章主要介紹了詳解基于Vue/React項(xiàng)目的移動(dòng)端適配方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
vue+axios實(shí)現(xiàn)post文件下載
這篇文章主要為大家詳細(xì)介紹了vue+axios實(shí)現(xiàn)post文件下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
Vue3 appear 失效的問(wèn)題及如何使用 appear
appear 是一個(gè)在元素默認(rèn)被顯示的情況下 調(diào)用進(jìn)入動(dòng)畫(huà)效果,使得元素在這種初次渲染情況下 執(zhí)行進(jìn)入動(dòng)畫(huà)的屬性,最近在學(xué)習(xí)vue3的動(dòng)畫(huà)時(shí)遇到appear無(wú)法生效的問(wèn)題,本文給大家詳細(xì)講解,感興趣的朋友一起看看吧2023-10-10
Vue通過(guò)axios異步請(qǐng)求后端接口的方法
在現(xiàn)代Web開(kāi)發(fā)中,前端與后端的數(shù)據(jù)交互至關(guān)重要,Vue.js作為一款流行的前端框架,結(jié)合Axios庫(kù)能夠高效地實(shí)現(xiàn)HTTP請(qǐng)求與數(shù)據(jù)處理,本文將詳細(xì)講解如何在Vue 3中使用Axios,并通過(guò)實(shí)際案例展示其用法,需要的朋友可以參考下2024-12-12
Vue 中v-model的完整用法及v-model的實(shí)現(xiàn)原理解析
這篇文章詳細(xì)介紹了Vue.js中的v-model指令的使用,包括基本用法、原理、結(jié)合不同類型的表單元素(如radio、checkbox、select)以及使用修飾符(如lazy、number、trim)等,感興趣的朋友一起看看吧2025-02-02
vue基礎(chǔ)之事件v-onclick="函數(shù)"用法示例
這篇文章主要介紹了vue基礎(chǔ)之事件v-onclick="函數(shù)"用法,結(jié)合實(shí)例形式分析了vue.js事件v-on:click="函數(shù)"的data數(shù)據(jù)添加、點(diǎn)擊響應(yīng)、以及留言本功能相關(guān)操作技巧,需要的朋友可以參考下2019-03-03
vue使用swiper實(shí)現(xiàn)左右滑動(dòng)切換圖片
這篇文章主要為大家詳細(xì)介紹了vue使用swiper實(shí)現(xiàn)左右滑動(dòng)切換圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10

