Vue element-ui 動(dòng)態(tài)合并行列

后端返回一個(gè) list ,先根據(jù) list 處理為表格,同時(shí)想要實(shí)現(xiàn) word 里面那種任意合并單元格的樣式,查了好多地方。效果如下:


效果

即根據(jù)數(shù)據(jù)內(nèi)容進(jìn)行動(dòng)態(tài)合并,思路是先將 list 數(shù)據(jù)處理為 對(duì)象 形式:

var recv = [
['1','1','3','4','5'],
['6','7','8','9','10'],
['11','12','13','9','15'],
['11','17','18','19','19']]

var tableKey = []

var tableData = []

var obj = new Object()

recv[0].forEach((item,index,array)=>{
    tableKey.push({value:'col'+index, name:item})
})

recv.forEach((item,index,array)=>{
    item.forEach((iitem,iindex,iarray)=>{
        obj['col'+iindex]=iitem
    })
    tableData.push(obj)
    // 清空對(duì)象
    obj = new Object()
})

這樣表頭數(shù)據(jù)和表格數(shù)據(jù)就會(huì)裝載為:

tableData = [
{"value":"col0","name":"1"},
{"value":"col1","name":"1"},
{"value":"col2","name":"3"},
{"value":"col3","name":"4"},
{"value":"col4","name":"5"}]

tableData = [
{"col0":"1","col1":"1","col2":"3","col3":"4","col4":"5"},
{"col0":"6","col1":"7","col2":"8","col3":"9","col4":"10"},
{"col0":"11","col1":"12","col2":"13","col3":"9","col4":"15"},
{"col0":"11","col1":"17","col2":"18","col3":"19","col4":"19"}
]

最后在組件中進(jìn)行處理:

export default{
    name: 'table',
    data(){
        return{
            // 行合并數(shù)據(jù)和列合并數(shù)據(jù)
            spanRowArrs:[],
            spanColArrs:[],
            tableKey,
            tableData
        }
    },
    created(){
        // 掛載函數(shù)
        this.getSpanArr(this.tableData)
        this.getRowSpanArr(this.tableData)
    },
    methods:{
        // 1 處理縱向數(shù)據(jù)
        getSpanArr(data) {
            var spanArr=[];
            for (var prop in data[0]){
                for (var i = 0; i < data.length; i++) {
                    if (i === 0) {
                        spanArr.push(1);
                        this.pos = 0;
                    } else {
                        if (data[i][prop] === data[i - 1][prop]) {
                            spanArr[this.pos] += 1;
                            spanArr.push(0);
                        } else {
                            spanArr.push(1);
                            this.pos = i;
                        }
                    }
                }
                this.spanRowArrs.push(spanArr)
                spanArr = []
            }
        },
        
        // 2. 處理橫向數(shù)據(jù)
        getRowSpanArr(data){
            var spanArr=[];
            var keyArr = Object.keys(data[0]);

            for(var i = 0 ; i < data.length; i++){
                for(var j = 0; j< keyArr.length; j++){
                    if (j === 0){
                        spanArr.push(1);
                        this.pos=0;
                    }else{
                        if(data[i][keyArr[j]] === data[i][keyArr[j-1]]){
                            spanArr[this.pos] += 1;
                            spanArr.push(0);
                        } else {
                            spanArr.push(1);
                            this.pos = j;
                        }
                    }
                }
                this.spanColArrs.push(spanArr)
                spanArr = []
            }
        },

        // 3 返回合并數(shù)
        spanMethod({ row, column, rowIndex, columnIndex }){
            if (columnIndex >= 0) {
                const _row = this.spanRowArrs[columnIndex][rowIndex];        
                const _col = this.spanColArrs[rowIndex][columnIndex];
                //const _col = _row > 0 ? 1 : 0;        
                return {            
                    rowspan: _row,
                    colspan: _col        
                }
            }
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容