【组件优化】iview表格在show-summary模式下展示合计行,并支持点击

需求是合计行不参与排序,并支持非0点击和样式,如下图,iview本身并不支持此类操作

在这里插入图片描述

1. 把iviewTable源码复制到本地文件并引入使用,记得引入组件内的js文件
在这里插入图片描述

2.在使用的文件中,通过iview自定义【合计行】的方法summary-method,给每项配置类名和方法

<table-v2
        slot="content"
        show-summary
        :summary-method="handleSum" // iview自定义【合计行】
        :columns="columnsStatictics"
        :data="dataCategory.statiscalData"
    />
handleSum ({ columns, data }) {
     const sums = {};
     let that = this; // 记得改变this;
     columns.forEach((column, index) => {
         const key = column.key;
         if (index === 0) {
             sums[key] = {
                 key,
                 value: '合计'
             };
             return;
         }
         const values = data.map(item => Number(item[key].count));
         if (!values.every(value => isNaN(value))) {
             const v = values.reduce((prev, curr) => {
                 const value = Number(curr);
                 if (!isNaN(value)) {
                     return prev + curr;
                 } else {
                     return prev;
                 }
             }, 0);
             // 给非0的每项添加类名和方法,除此之外,其他的配置都是照着iview写
             if (v > 0) {
                 sums[key] = {
                     key,
                     value: v,
                     cls: 'total-cell-td-container',
                     fn: function (data) {
	// 这个方法里面写点击要做的事情
                         if (!data.value) return;
                         that.detailKey = '挽回经济损失金额(万元)';
                         let item = {
                             measure_ids: that.totalStatiscalData[0][data.key].measure_ids || [],
                             data_item: data.key
                         }
                         this.drawerDept = '公司';
                         this.getStatisticalDetail(item);
                     }
                 };
             } else {
                 sums[key] = {
                     key,
                     value: v,
                     cls: ''
                 };
             }
         } else {
             sums[key] = {
                 key,
                 value: 0
             };
         }
     });
     return sums;
 },

3.在复制过来的Table组件中,增加类名和调用方法

// 这是summary.vue, 表格合计行的组件,我仅增加了类名和方法
<template>
    <div style="overflow:hidden;">
        <table
            class="ivu-table-summary"
            cellspacing="0"
            cellpadding="0"
            border="0"
            :style="styleObject"
        >
            <colgroup>
                <col v-for="(column, index) in columns" :width="setCellWidth(column)" />
            </colgroup>
            <tbody :class="[prefixCls + '-tbody']">
                <tr class="ivu-table-row">
                    <td v-for="(column, index) in columns" :class="alignCls(column)">
                        <div class="ivu-table-cell" :class="cellCls(column)">
                        	// 这是我做的类名和方法改动
                            <span
                                :class="data[column.key].cls"
                                @click="handleClick(data[column.key])"
                            >{{ data[column.key].value }}</span>
                        </div>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
</template>
<script>
import Mixin from './mixin';

export default {
    name: 'TableSummary',
    mixins: [Mixin],
    props: {
        prefixCls: String,
        styleObject: Object,
        columns: Array,
        data: Object,    // rebuildData
        columnsWidth: Object,
        fixed: {
            type: [Boolean, String],
            default: false
        }
    },
    methods: {
        cellCls (column) {
            return [
                {
                    ['ivu-table-hidden']: (this.fixed === 'left' && column.fixed !== 'left') || (this.fixed === 'right' && column.fixed !== 'right') || (!this.fixed && column.fixed && (column.fixed === 'left' || column.fixed === 'right'))
                }
            ];
        },
        handleClick (item) {
        // 调用父组件的方法
            item.fn && item.fn(item);
        }
    }
};
</script>

4.通过设置的类名改变样式

// 在调用页面写即可
.ivu-table-with-summary {
    .total-cell-td-container {
        color: #dc2f03;
        cursor: pointer;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要实现这个功能,你需要做以下几个步骤: 1. 在 iView table 中,添加两个按钮,一个用于删除,一个用于添加。 2. 在按钮的 click 事件中,分别调用 table 的 remove() 和 append() 方法来删除和添加。 3. 要实现点外部按钮删除的功能,你需要在页面中使用 ref 来获取到 table 的实例,然后在按钮的 click 事件中,通过 $refs.table 来调用 remove() 方法。 4. 同样的,要实现点外部按钮添加的功能,你也需要在页面中使用 ref 来获取到 table 的实例,然后在按钮的 click 事件中,通过 $refs.table 来调用 append() 方法。 下面是一个示例代码: ```html <template> <div> <Button @click="removeRow">删除</Button> <Button @click="addRow">添加</Button> <Table :data="tableData" ref="table"> <TableColumn prop="name" label="姓名"></TableColumn> <TableColumn prop="age" label="年龄"></TableColumn> <TableColumn prop="address" label="地址"></TableColumn> </Table> </div> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 18, address: '北京市' }, { name: '李四', age: 20, address: '上海市' }, { name: '王五', age: 22, address: '广州市' }, ], }; }, methods: { removeRow() { this.$refs.table.remove(this.tableData[0]); }, addRow() { this.$refs.table.append({ name: '赵六', age: 24, address: '深圳市' }); }, }, }; </script> ``` 在这个示例中,我们在 iView table 中添加了两个按钮,并分别绑定了 removeRow() 和 addRow() 两个方法。在这两个方法中,我们分别通过 $refs.table 来调用了 table 的 remove() 和 append() 方法来删除和添加。同时,我们也使用了 ref 来获取到了 table 的实例。这样,就可以实现在外部按钮中删除和添加 table 表格的功能了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值