1、目标效果
源码放在下面,复制粘贴即可
(1)合计行放在头部,且字体颜色变粗、合计行背景色变粗
(2)合计行年龄算平均值且字体颜色为绿色,财产算总数且字体颜色为红色
2、原理
3、源码
App.vue
<template>
<div id="app">
<SummaryTable></SummaryTable>
</div>
</template>
<script>
import SummaryTable from '@/components/SummaryTable'
export default {
components: {
SummaryTable
},
name: 'App',
data() {
return {
}
},
}
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
SummaryTable.vue
<template>
<div>
<el-table ref="table" id="table" :data="tableData" border style="width: 100%" show-summary
:summary-method="getSummaries">
<el-table-column prop="date" label="日期" width="180" fixed="left">
</el-table-column>
<el-table-column prop="name" label="姓名" width="180" fixed="left">
</el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="money" label="财产"></el-table-column>
<el-table-column prop="money" label="财产"></el-table-column>
<el-table-column prop="money" label="财产"></el-table-column>
<el-table-column prop="money" label="财产"></el-table-column>
</el-table>
</div>
</template>
<script>
export default {
name: 'App',
data() {
return {
tableData: [{
date: '2016-05-01',
name: '王小虎',
age: 13,
money: 100
}, {
date: '2016-05-02',
name: '王小虎',
age: 25,
money: 333
}, {
date: '2016-05-03',
name: '王小虎',
age: 33,
money: 555
}, {
date: '2016-05-04',
name: '王小虎',
age: 23,
money: 200
},
{
date: '2016-05-05',
name: '王小虎',
age: 26,
money: 666
}],
}
},
watch: {
tableData: {
immediate: true,
handler() {
setTimeout(() => {
const tds = document.querySelectorAll('#table .el-table__fixed-footer-wrapper tr>td');
tds[0].colSpan = 2;
tds[0].style.textAlign = 'center'
tds[1].style.display = 'none'
}, 0)
}
}
},
methods: {
// 合计行方法
getSummaries(param) {
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (column.property == 'date') {
sums[index] = '总价';
return;
}
// values是每一列的数据是一个数组
const values = data.map(item => Number(item[column.property]));
if (!values.every(value => isNaN(value))) {
// 对values进行一个累加操作,累加那些非NAN的值
const total = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
// 年龄计算平均值(绿色)
if (column.property == 'age') {
sums[index] = <span class={'green'}>{total / data.length}</span>
}
// 财产计算总数(红色)
if (column.property == 'money') {
sums[index] = <span class={'red'}>{total}</span>
}
}
});
// 将合计结果返回,是一个数组,每个位置的值与表格的列一一对应
return sums
}
}
}
</script>
<style scoped>
.red {
color: red;
font-weight: bolder;
}
.green {
color: lightgreen;
font-weight: bolder;
}
/* 存在固定列时,合计行位置修改开始 */
.el-table /deep/ .el-table__fixed {
display: flex;
flex-direction: column;
}
.el-table /deep/ .el-table__fixed-footer-wrapper,
.el-table /deep/ .el-table__fixed-body-wrapper,
.el-table /deep/ .el-table__fixed-header-wrapper {
position: initial;
}
.el-table /deep/ .el-table__fixed-body-wrapper {
order: 1;
}
.el-table /deep/ .el-table__fixed-footer-wrapper tbody td.el-table__cell {
border-top: none;
background: black;
color: white;
font-weight: bolder;
}
/* 存在固定列时,合计行位置修改开始 */
/* 默认有1px去掉样式影响 */
.el-table /deep/ .el-table__fixed::before {
height: 0;
}
/* 合计行整体样式修改开始 */
.el-table /deep/ .el-table__footer-wrapper tbody td {
background: black;
color: white;
font-weight: bolder;
}
/* 合计行整体样式修改结束*/
/* 合计行位置修改开始 */
.el-table {
display: flex;
flex-direction: column;
}
.el-table /deep/ .el-table__body-wrapper {
order: 1;
}
/* 合计行位置修改结束*/
</style>