231 lines
7.3 KiB
Java
Raw Normal View History

2025-04-18 14:58:41 +08:00
<template>
<a-card :bordered="false">
<a-row>
<a-col>
<a-switch v-bind="pageSwitchProps" v-model="pageSwitch"/>
</a-col>
<a-col>
<a-table
v-bind="tableProps"
@change="handleTableChange"
style="margin-top: 20px"
>
</a-table>
</a-col>
</a-row>
</a-card>
</template>
<script>
export default {
name: 'TableTotal',
data() {
return {
columns: [
{
title: '#',
width: '180px',
align: 'center',
dataIndex: 'rowIndex',
customRender: function (text, r, index) {
return (text !== '总计') ? (parseInt(index) + 1) : text
}
},
{
title: '姓名',
dataIndex: 'name',
width: 180,
},
{
title: '贡献点',
dataIndex: 'point',
width: 180,
},
{
title: '等级',
dataIndex: 'level',
width: 180,
},
{
title: '更新时间',
dataIndex: 'updateTime',
width: 180,
},
],
/* 分页参数 */
ipagination:{
current: 1,
pageSize: 10,
},
dataSource: [
{ id:"1",name: '张三', point: 23, level: 3, updateTime: '2019-8-14' },
{ name: '小王', point: 6, level: 1, updateTime: '2019-8-13' },
{ name: '李四', point: 53, level: 8, updateTime: '2019-8-12' },
{ name: '小红', point: 44, level: 5, updateTime: '2019-8-11' },
{ name: '王五', point: 97, level: 10, updateTime: '2019-8-10' },
{ name: '小明', point: 33, level: 2, updateTime: '2019-8-10' },
{ name: '小张', point: 33, level: 2, updateTime: '2019-8-10' },
{ name: '小六', point: 33, level: 2, updateTime: '2019-8-10' },
{ name: '小五', point: 33, level: 2, updateTime: '2019-8-10' },
{ name: '小赵', point: 33, level: 2, updateTime: '2019-8-10' },
{ name: '李华', point: 33, level: 2, updateTime: '2019-8-10' },
{ name: '小康', point: 33, level: 2, updateTime: '2019-8-10' },
{ name: '小鹿', point: 33, level: 2, updateTime: '2019-8-10' },
],
newArr:[],
newDataSource:[],
footerDataSource: [],
pageSwitch:true
}
},
computed:{
// 数据表格的固定属性
tableProps(){
let tableProps = {
size: 'middle',
rowKey:'rowIndex',
columns: this.columns,
scroll: {x: true},
}
let renderFooter = this.footerDataSource.length === 0 ? null : () => this.renderTableFooter(tableProps)
return {
...tableProps,
ref: 'table',
class: 'chart-data-list',
pagination:this.pageSwitch?this.ipagination:false,
columns: this.columns,
dataSource: this.dataSource,
footer: renderFooter,
}
},
pageSwitchProps() {
return {
checkedChildren: '分页',
unCheckedChildren: '分页',
style: {
position: 'absolute',
right: '0px',
top: '-10px'
}
}
},
},
mounted() {
// this.tableAddTotalRow(this.columns, this.dataSource)
/*新增分页合计方法*/
this.newDataSource=this.dataSource
this.dataHandling(1,this.ipagination.pageSize)
},
watch:{
//update-begin---author:wangshuai ---date:20220209 for[JTC-494]常用示例->表格合计写法改成新的写法------------
'pageSwitch':function(val){
if(!val){
this.dataHandling('-1',0)
}else{
this.dataHandling(1,this.ipagination.pageSize)
}
},
'ipagination.current':function(val) {
this.dataHandling(val,this.ipagination.pageSize)
},
//当合计行变化时,绑定滚动条
'footerDataSource': {
async handler(dataSource) {
// 当底部合计行有值,并且显示出来时,再同步滚动条
if (dataSource && dataSource.length > 0) {
await this.$nextTick()
// 同步表与footer滚动
let dom = this.$refs.table.$el.querySelectorAll('.ant-table-body')[0]
let footerDom = this.$refs.footerTable.$el.querySelectorAll('.ant-table-body')[0]
dom.addEventListener(
'scroll',
() => {
footerDom.scrollLeft = dom.scrollLeft
},
true,
)
}
},
//update-end---author:wangshuai ---date:20220209 for[JTC-494]常用示例->表格合计写法改成新的写法------------
}
},
methods: {
/** 表格增加合计行 */
tableAddTotalRow(columns, dataSource) {
let numKey = 'rowIndex'
let totalRow = { [numKey]: '合计' }
columns.forEach(column => {
let { key, dataIndex } = column
if (![key, dataIndex].includes(numKey)) {
let total = 0
dataSource.forEach(data => {
total += /^\d+\.?\d?$/.test(data[dataIndex]) ? Number.parseInt(data[dataIndex]) : Number.NaN
console.log(data[dataIndex], ':', (/^\d+\.?\d?$/.test(data[dataIndex]) ? Number.parseInt(data[dataIndex]) : Number.NaN))
})
if (Number.isNaN(total)) {
total = '-'
}
totalRow[dataIndex] = total
}
})
dataSource.push(totalRow)
},
handleTableChange(pagination, filters, sorter) {
this.ipagination = pagination;
},
//update-begin---author:wangshuai ---date:20220209 for[JTC-494]常用示例->表格合计写法改成新的写法------------
/*如果分页走这个方法*/
dataHandling(pageNo,pageSize) {
//根据当前页数和每页显示条数分割数组
let arrs = [];
//如果pageNo不是-1不分页,那么需要对数据进行分页计算
if(pageNo!=-1){
arrs = this.newDataSource.slice((pageNo-1)*pageSize,pageNo*pageSize)
}else{
arrs = this.newDataSource
}
let newDataSource=[];
let newArr= { };
newArr.rowIndex="总计"
let level=0;
let point=0;
//每一项的数值相加
for (let j=0;j<arrs.length;j++){
level+=arrs[j].level;
point+=arrs[j].point;
}
newArr.level=level;
newArr.point=point;
newDataSource.push(newArr);
//给foot底部数组赋值
this.footerDataSource = newDataSource;
},
// 渲染表格底部合计行
renderTableFooter(tableProps) {
let h = this.$createElement
return h('a-table', {
ref: 'footerTable',
props: {
...tableProps,
pagination: false,
dataSource: this.footerDataSource,
showHeader: false,
},
})
//update-end---author:wangshuai ---date:20220209 for[JTC-494]常用示例->表格合计写法改成新的写法------------
}
}
}
</script>
<style scoped lang="less">
/deep/ .chart-data-list .ant-table-footer .ant-table-body{
overflow: hidden !important;
}
/deep/ .ant-table-footer{
padding:0;
}
</style>