前言:
本文主要解决在
Ant Design Vue
中的table
组件末尾增加合计行的需求。遇到的问题点有如下几个:
- table中的合计行如何添加?
- table中不是所有列都需要合计,如何处理?
- 有的是 “时分秒(hh:mm:ss)” 的合计,有的是数量的合计,有的是百分数的合计,需要前端自行计算,如何处理?
- 合计行的数据如何居中?
一、背景
最近后台管理系统的项目中有个新需求,在统计列表中,需要在末尾展示有些数据列的合计。原型图如下:
二、table中的合计行如何添加?
官网的Table表格中给出了“总结栏”的案例参考:
按照官网的示例,可以按照如下步骤实现:
在table中加入下图这部分代码,即#summary
设置合计栏,a-table-summary-row
和a-table-summary-cell
代码行列:
1 | js复制代码<template #summary v-if="dataSource && dataSource.length"> |
三、table中不是所有列都需要合计,如何处理?
如我这边的原型图所示:
- 第一列是“合计”的文案,第二列是“姓名”的文案,处理方式如下图:
- 其余列用
for
循环统一处理:
1 | js复制代码// columns.slice(2):前两列不参与循环 |
四、进行合计的数据类型不只是number
如原型图所示,我这边需要进行合计的有:时分秒、百分比、数量,下面分别列举解决方案。
- “时分秒(hh:mm:ss)” 的累加合计实现方案:
1 | js复制代码sumDurations(durations) { |
- 百分数的合计实现方案:
接口返回的是纯数字,不带百分号的值,所以需要前端进行手动拼接。
另外看需求限制保留几位小数。
ps:我这边百分数的合计是求的平均数,所以除以了数组的长度。
1 | js复制代码const total = this.dataSource.reduce((prev: number, next: { [x: string]: any }) => { |
- 数量的合计实现方案:
1 | js复制代码this.dataSource.reduce((prev: number, next: { [x: string]: any }) => { |
五、整理思路,实现结果
- 首先在
columns
数组中用type
区分类型:
combinedNums
方法接受两个参数,分别是字段名称
和type
类型:
具体实现方法如下:
1 | js复制代码combinedNums(field: string, type: any) { |
六、合计行中的文案如何居中
在<a-table-summary-row>
标签中加上align="center"
即可:
以上,希望对大家有帮助!
本文转载自: 掘金