实现table表格数据按名称字段分层,各层都有一个合计行,自定义的表格总合计行(vue.js+elementUI)

代码实现

<div class="tableBody" ref="tableBody">
      <table>
        <div v-for="(item,index) in tableData"
             :key="index">
            <el-table
                    :data="item.list"
                    :show-header="index===0"
                    border
                    ref="table"
                    show-summary
                    width="100%"
                    :summary-method="getSummaries">
                <el-table-column
                        align="center"
                        prop="id"
                        label="ID"
                        width="400px">
                </el-table-column>
                <el-table-column
                        align="center"
                        prop="name"
                        label="姓名" width="400px">
                </el-table-column>
                <el-table-column
                        align="center"
                        prop="amount1"
                        label="数值1" width="400px">
                </el-table-column>
                <el-table-column
                        align="center"
                        prop="amount2"
                        label="数值2"width="400px">
                </el-table-column>
            </el-table>
        </div>
        <div class='sum_footer' ref='sum_heji'>
            <div class='sum_footer_unit left'></div>
            <div class='sum_footer_unit'>本页合计</div>
            <div class='sum_footer_unit'>{{getTotal('amount1')}}</div>
            <div class='sum_footer_unit'>{{getTotal('amount2')}}</div>
        </div>
      </table>
    </div>

data(){
        return {
          initData:[{
            id: '12987122',
            name: '王小虎',
            amount1: 234,
            amount2: 3.2
          }, {
            id: '12987123',
            name: '王小虎',
            amount1: 165,
            amount2: 4.43
          }, {
            id: '12987124',
            name: '王小虎',
            amount1: 324,
            amount2: 1.9
          }, {
            id: '12987125',
            name: '王小虎',
            amount1: 621,
            amount2: 2.2
          }, {
            id: '12987126',
            name: '王小龙',
            amount1: 234,
            amount2: 3.2
          }, {
            id: '12987127',
            name: '王小龙',
            amount1: 165,
            amount2: 4.43
          }, {
            id: '12987128',
            name: '王小豹',
            amount1: 234,
            amount2: 3.2,
          }],
          tableData: []
        }
      },
      methods: {
          // 调节表格合计行宽度
          adjustWidth() {
            this.$nextTick(()=>{
                if(this.$refs.sum_heji && this.$refs.table){
                    let width = getComputedStyle(this.$refs.table[0].$refs.headerWrapper.querySelector('table')).width;
                    this.$refs.sum_heji.style = 'width:' + width;
                    this.$refs.sum_heji.style = 'overflow:' + 'auto';
                    Array.from(this.$refs.table[0].$refs.headerWrapper.querySelectorAll('col')).forEach((n, i) => {
                        if(n.getAttribute('width') != 0){
                            let childWidth = n.getAttribute('width') - 9;
                            this.$refs.sum_heji.children[i].style = 'width:' + childWidth + 'px';
                        }
                    });
                }
            })
          },
          // 表格合计
          getSummaries(param) {
                const { columns, data } = param;
                const sums = [];
                columns.forEach((column, index) => {
                    if (index === 1) {
                        sums[index] = data[0].name + "合计";
                        return;
                    }else if(index > 1){
                        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] = sums[index].toFixed(2)
                            sums[index] += "";
                        } else {
                            sums[index] = "";
                        }
                    }
                });
                return sums;
            },
             // 计算表格合计行
             getTotal (name) {
                var sum = 0;
                this.initData.forEach((n) => {
                    sum += parseFloat(n[name]);
                })
                sum = sum.toFixed(2)
                return sum;
            },
      },
      mounted(){
        // 监听窗口的变化
        window.onresize = () => {
            return (() => {
               this.adjustWidth()
            })()
        };
        // 将数据转化成我们想要的数据格式
        // tableData: [{
        //   name:'王小虎',
        //   list:[{
        //     id: '12987122',
        //     name: '王小虎',
        //     amount1: 234,
        //     amount2: 3.2,
        //   }, {
        //     id: '12987123',
        //     name: '王小虎',
        //     amount1: 165,
        //     amount2: 4.43,
        //     amount3: 12
        //   }, {
        //     id: '12987124',
        //     name: '王小虎',
        //     amount1: 324,
        //     amount2: 1.9,
        //   }, {
        //     id: '12987125',
        //     name: '王小虎',
        //     amount1: 621,
        //     amount2: 2.2,
        //   }]
        // },{
        //   name:'王小龙',
        //   list:[{
        //     id: '12987126',
        //     name: '王小龙',
        //     amount1: 234,
        //     amount2: 3.2,
        //   }, {
        //     id: '12987127',
        //     name: '王小龙',
        //     amount1: 165,
        //     amount2: 4.43,
        //   }]
        // },{
        //   name:'王小豹',
        //   list:[{
        //     id: '12987128',
        //     name: '王小豹',
        //     amount1: 234,
        //     amount2: 3.2,
        //   }]
        // }]
        // 数据按姓名字段分层
        this.initData.forEach(item1 => {
          if (this.tableData.length == 0) {
            this.tableData.push({name: item1.name, list: [item1]})
          } else {
            let res = this.tableData.some(item => {//判断相同姓名,有就添加到当前项
                if (item.name == item1.name) {
                    item.list.push(item1)
                    return true
                }
            })
            if (!res) {//如果没找相同姓名就添加一个新对象
              this.tableData.push({name: item1.name, list: [item1]})
            }
          }
        });
        this.adjustWidth()
        // setTimeout(()=>{
            // this.adjustWidth()
        // },200)
        console.log(this.tableData)
      }
    })
.tableBody{ 
      /* 让表格字段过多时也只存在一个横向滚动条 */
        display:flex;
        flex-wrap:wrap;
        align-content:flex-start;
        overflow:auto;
}
.sum_footer {
        display: flex;
        display: -webkit-flex;
        height: 40px;
        overflow: visible!important;
}
.sum_footer_unit {
        flex-shrink:0;
        font-size: 13px;
        font-weight: 800;
        color: #606266;
        padding: 0 4px;
        display: flex;
        align-items: center;
        justify-content: center;
        word-break:break-word;
        border-bottom: 1px solid #ebeef5;
        border-right: 1px solid #ebeef5;
        border-top: 1px solid #ebeef5;
        text-align: center;
}
.left {
        border-left: 1px solid #ebeef5;
}

效果如下

另外当数据过多时想固定表头可参考以下链接内容:

实现固定表格自定义表头

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
el-table组件是Vue.js中非常常用的表格组件,它提供了丰富的功能和配置选项。其中,自定义合计是el-table一个重要功能之一,可以用于计算表格中某一列的合计值。 要实现el-table自定义合计,你可以使用el-table-column组件的summary-method属性。这个属性接受一个函数,用于计算合计值并返回。 下面是一个示例代码,演示了如何在el-table自定义合计: ```html <template> <el-table :data="tableData" style="width: 100%"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column prop="score" label="分数" :summary-method="getTotalScore"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 18, score: 80 }, { name: '李四', age: 20, score: 90 }, { name: '王五', age: 22, score: 85 } ] }; }, methods: { getTotalScore(param) { const { columns, data } = param; if (columns.length === 1) { // 只有一列时,直接返回合计值 let total = 0; data.forEach(item => { total += item.score; }); return `合计:${total}`; } else { // 多列时,返回空字符串 return ''; } } } }; </script> ``` 在上面的代码中,我们定义了一个el-table组件,其中包含了三个el-table-column组件。其中,第三个el-table-column组件的summary-method属性绑定了一个名为getTotalScore的方法。这个方法接受一个参数param,包含了当前列的信息和数据。在getTotalScore方法中,我们通过遍历数据计算出分数的合计值,并返回合计值。 通过以上代码,你可以实现el-table自定义合计功能。你可以根据自己的需求,修改getTotalScore方法来计算其他列的合计值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值