element UI合并列,并且在合并列之后进行数字排序

element UI 合并列后,进行数字排序

最近业务需要实现单元格合并列的功能,并且在第一列用数字进行排序,今天整理了一下实现过程,贡献给在座的各位

实现后的样式如下

实现后的样式

直接上代码

html代码

<template>
    <div>
        <el-table
        :data="tableData"
        :span-method="objectSpanMethod"
        border
        style="width: 100%; margin-top: 20px">
            <el-table-column
                prop="sequence"
                label="第一种序号排序">
        </el-table-column>
        <el-table-column
                prop="name"
                label="姓名">
        </el-table-column>
            <el-table-column
                    label="第二种序号排序">
                <template slot-scope="scope">
                    <span>{
   
   { scope.$index + 1 }}</span>
                </template>
            </el-table-column>
        <el-table-column
                prop="amount1"
                label="数值 1(元)">
        </el-table-column>
        <el-table-column
                prop="amount2"
                label="数值 2(元)">
        </el-table-column>
        <el-table-column
                prop="amount3"
                label="数值 3(元)">
        </el-table-column>
    </el-table>
    </div>
</template>

js代码

export default {
    
    
        name: "Test",
        data() {
    
    
            return {
    
    
                tableData: [{
    
    
                    name: '王小虎',
                    amount1: '234',
                    amount2: '3.2',
                    amount3: 10
                }, {
    
    
                    name: '王小虎',
                    amount1: '165',
                    amount2: '4.43',
                    amount3: 12
                }, {
    
    
                    name: '黄晓明',
                    amount1: '324',
                    amount2: '1.9',
                    amount3: 9
                }, {
    
    
                    name: '黄晓明',
                    amount1: '621',
                    amount2: '2.2',
                    amount3: 17
                }, {
    
    
                    name: '小王',
                    amount1: '539',
                    amount2: '4.1',
                    amount3: 15
                }, {
    
    
                    name: '小李',
                    amount1: '539',
                    amount2: '4.1',
                    amount3: 15
                }]
            };
        },
        methods: {
    
    
            objectSpanMethod({
    
     row, column, rowIndex, columnIndex }) {
    
    
                if(columnIndex === 0 ) {
    
    
                    const _row = (this.flitterData(this.tableData).one)[rowIndex];
                    const _col = _row > 0 ? 1 : 0;
                    let arr=this.flitterData(this.tableData).one,
                        Nosort=0;
                    for(let i in arr){
    
    
                        if(arr[i]>0){
    
    
                            Nosort+=1;
                        }
                        //为编号赋值,如果_row>0,序号+1,如果_row=0,序号保持不变
                        for(let j in this.tableData){
    
    
                            if(i===j){
    
    
                                this.tableData[i].sequence=Nosort;
                            }
                        }
                    }
                    return {
    
    
                        rowspan: _row,
                        colspan: _col
                    };
                }
                if(columnIndex === 1) {
    
    
                    const _row = (this.flitterData(this.tableData).two)[rowIndex];
                    const _col = _row > 0 ? 1 : 0;
                    return {
    
    
                        rowspan: _row,
                        colspan: _col
                    };
                }
            },

            flitterData(arr){
    
    
                let spanOneArr = [],
                    spanTwoArr = [],
                    concatOne = 0,
                    concatTwo = 0;
                arr.forEach((item,index)=>{
    
    
                    if(index === 0){
    
    
                        spanOneArr.push(1);
                        spanTwoArr.push(1);
                    }else{
    
    
                        if(item.name === arr[index - 1].name){
    
     //第一列需合并相同内容的判断条件
                            spanOneArr[concatOne] += 1;
                            spanOneArr.push(0);
                        }else{
    
    
                            spanOneArr.push(1);
                            concatOne = index;
                        };
                        if(item.name === arr[index - 1].name){
    
    //第二列需合并相同内容的判断条件
                            spanTwoArr[concatTwo] += 1;
                            spanTwoArr.push(0);
                        }else{
    
    
                            spanTwoArr.push(1);
                            concatTwo = index;
                        };
                    }
                });
                return  {
    
    
                    one: spanOneArr,
                    two: spanTwoArr
                }
            },
        }
    };

上边的功能实现了两种序号的排序方式,第二种序号的排序方式是直接通过插槽直接累加来排序的,在我的业务中并不适用。第一种排序方式是通过Nosort字段判断当前行是否已经合并之后在进行累加的,完美解决了我的需求。

猜你喜欢

转载自blog.csdn.net/qq_41648113/article/details/109336850