【Vue+el-element】表格相同数据合并单元格

博客第二天纪念日—被表格玩的一天开始了(꒦_꒦)
今天挑战表格相同数据合并单元格,其他列不同数据添加到一行显示

  1. 官方–方法

element中有表格合并的方法:
通过给table传入span-method方法可以实现合并行或列。详见链接: element表格.

  1. 全场最佳–方法

but我们今天要用到的是另一种处理数据的方法:将拿到的table数据循环两次,判断第一次循环拿到的name和第二次循环拿到的name是否相等,如果相等,将当前循环到的其他字段的数据添加到对应数据的后面,并显示出数据。最后整张表进行去重操作。如图所示:贴出代码,仅供参考
在这里插入图片描述
下面展示一些 内联代码片


    data() {
        return {
            tableData: [
                {
                    name: '虎子',
                    sort: '数学:66'
                },
                {
                    name: '虎子',
                    sort: '语文:66'
                },
                {
                    name: '虎子',
                    sort: '英语:66'
                },
                {
                    name: '胖丫',
                    sort: '历史:99'
                },
                {
                    name: '胖丫',
                    sort: '地理:99'
                },
                {
                    name: '翠花',
                    sort: '物理:10'
                },
                {
                    name: '铁柱',
                    sort: '化学:20'
                },
                {
                    name: '旺财',
                    sort: '生物:30'
                },
                {
                    name: '旺财',
                    sort: '数学:40'
                }
            ]
        };
    },
    created() {
        this.setrowspans();
    },
    methods: {
        setrowspans() {
            let resData = JSON.parse(JSON.stringify(this.tableData));
            for (let i = 0; i < resData.length; i ++) {
                const v1 = resData[i];
                for (let j = 0; j < this.tableData.length; j ++) {
                    const v2 = this.tableData[j];
                    // 拿第一次循环的name和第二次循环的name 对比,若相同并且sort不同
                    if ((v1.name === v2.name)
                                && v1.sort !== v2.sort) {
                        // 让v1的sort追加成v1,v2形式
                        let str = JSON.parse(JSON.stringify(`${v1.sort},${v2.sort}`));
                        v1.sort = str;
                    }
                }
            }
            // 根据name去除,优先显示前面的索引
            resData = resData.filter((item, index, self) =>
                index === self.findIndex((t) =>
                    (t.name === item.name)
                ));
            this.tableData = resData;
        }
    }
  1. 不知道是谁的–方法

若要实现下图所示结果,下面展示方法。在这里插入图片描述


    created() {
        this.setrowspans();
    },
    methods: {
        // eslint-disable-next-line no-unused-vars
        objectSpanMethod({ row, column, rowIndex, columnIndex }) {
            if (columnIndex === 0) {
                return {
                    rowspan: row.rowspan,
                    colspan: 1
                };
            }
        },
        setrowspans() {
            this.tableData.forEach((v) => {
                v.rowspan = 1;
            });
            for (let i = 0; i < this.tableData.length; i ++) {
                for (let j = i + 1; j < this.tableData.length; j ++) {
                    if (this.tableData[i].name === this.tableData[j].name) {
                        this.tableData[i].rowspan ++;
                        this.tableData[j].rowspan --;
                    }
                }
                // 跳过重复的数据
                i = i + this.tableData[i].rowspan - 1;
            }
        }

详情参考文章链接: 合并表格相同数据.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您可以通过自定义合并规则来实现vue element-ui table单元的动态合并。以下是一个简单的示例代码: ``` <template> <el-table :data="tableData" ref="multiTable" border> <el-table-column prop="name" label="Name" width="180"> </el-table-column> <el-table-column prop="age" label="Age" width="180"> </el-table-column> <el-table-column prop="gender" label="Gender" width="180" :cell-style="{padding: '0px'}" :render-header="renderHeader" :render-cell="renderCell"> </el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: 'Tom', age: 18, gender: 'M' }, { name: 'Jane', age: 22, gender: 'F' }, { name: 'John', age: 28, gender: 'M' }, { name: 'Lisa', age: 24, gender: 'F' } ] } }, methods: { // 自定义表头渲染函数 renderHeader(h, { column }) { if (column.property === 'gender') { return h('div', [ h('span', 'Gender'), h('el-checkbox', { on: { change: this.handleMultiHeaderChange } }) ]) } else { return h('div', column.label) } }, // 自定义单元渲染函数 renderCell(h, { row, column }, index) { const rowspan = this.getMultiRowspan(row, column) if (rowspan === 0) { return '' } else { return h('div', { style: { lineHeight: `${80 * rowspan}px` }, attrs: { rowspan: rowspan } }, row.gender) } }, // 计算单元跨行数 getMultiRowspan(row, column) { const data = this.tableData let rowspan = 1 let currentIndex = data.indexOf(row) for (let i = currentIndex + 1; i < data.length; i++) { if (data[i][column.property] === row[column.property]) { rowspan++ } else { break } } return rowspan }, // 表头复选框改变事件 handleMultiHeaderChange(value) { const table = this.$refs.multiTable const columns = table.columns columns.forEach((column) => { if (column.property === 'gender') { column.filteredValue = value ? ['M', 'F'] : [] table.store.commit('filterChange', { column: column }) } }) } } } </script> ``` 在这个示例代码中,我们使用了自定义渲染函数来渲染表格,其中: - `renderHeader` 函数用于渲染表头,其中包含一个复选框来控制表格的动态合并; - `renderCell` 函数用于渲染单元,其中通过 `getMultiRowspan` 函数计算出单元需要跨越的行数。 需要注意的是,这里的示例代码仅供参考,具体实现可能会因为表格数据结构和合并规则的不同而有所不同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值