轉自:https://www.cnblogs.com/chen-yi-yi/p/11224346.html
通過 span-method 綁定方法 objectSpanMethod方法
this.getSpanArr(this.tableData); //this.tableData 指接口取到的數據
// 2、 因為要合並的行數是不固定的,此函數是實現合並隨意行數的功能
getSpanArr(data) {
this.spanArr = [];
for (var i = 0; i < data.length; i++) {
if (i === 0) {
// 如果是第一條記錄(即索引是0的時候),向數組中加入1
this.spanArr.push(1);
this.pos = 0;
} else {
if (data[i].parentCode === data[i - 1].parentCode) {
// 如果parentCode相等就累加,並且push 0 這里是根據一樣的parentCode匹配
this.spanArr[this.pos] += 1;
this.spanArr.push(0);
} else {
// 不相等push 1
this.spanArr.push(1);
this.pos = i;
}
}
}
},
// 3、合並行數
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
// columnIndex === 0 找到第一列,實現合並隨機出現的行數
if (columnIndex === 0) {
const _row = this.spanArr[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
rowspan: _row,
colspan: _col
};
}
},
可根據需求進行調整,上面的只是第一列合並,如果需求需要多列內容分別合並,且后面幾列需要在前一列合並的基礎上合並,該怎么做呢?
/**
* 獲取XXXXX列數據,判斷上下兩個數據是否一致
* 將對應列數據初始化為空數組,第一個數據默認為1
* 如果上下數據一致,則對應下標的數值+1,並同時push一個0
* 示例:【1,1,2,0,1】則表示第三行數據合並,合並兩行,並刪除第四行數據
*/
getMatterArr(data, name) {
this.matterArr = [];
for (var i = 0; i < data.length; i++) {
if (i === 0) {
this.matterArr.push(1);
this.pos = 0;
} else {
if (data[i][name] === data[i - 1][name]) {
this.matterArr[this.pos] += 1;
this.matterArr.push(0);
} else {
this.matterArr.push(1);
this.pos = i;
}
}
}
},
/**
* 獲取XXXX列數據,判斷上下兩個數據是否一致
* 將對應列數據初始化為空數組,第一個數據默認為1
* 如果上下數據一致,則對應下標的數值+1,並同時push一個0
* 示例:【1,1,2,0,1】則表示第三行數據合並,合並兩行,並刪除第四行數據
*/
getReMatterArr(data, name) {
this.reMatterArr = [];
for (var i = 0; i < data.length; i++) {
if (i === 0) {
this.reMatterArr.push(1);
this.index = 0;
} else {
if (data[i][name] === data[i - 1][name]) {
this.reMatterArr[this.index] += 1;
this.reMatterArr.push(0);
} else {
this.reMatterArr.push(1);
this.index = i;
}
}
}
},
/**
* 合並行數據
* 如果抵消事項數據第二個數據和前一個數據一樣,則將其行進行合並
* 報表事項則先判斷對應的抵消事項是否合並,如果抵消事項處於合並狀態,則其后面的報表事項允許合並
* @param rowIndex第幾行,columnIndex第幾列
* @param matterCode,第一個判斷數據是否一致的字段
* @param secondColumnKey 第二列判斷是否一致的字段(該字段是由第一列標識 + 第二列標識合並得到的,由后台返回的 )
*/
mergeColumn({ row, column, rowIndex, columnIndex }) {
// columnIndex === 0 找到第一列,實現抵消事項合並
if (columnIndex === 0) {
this.getMatterArr(this.pageData, "matterCode");
const _row = this.matterArr[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
rowspan: _row,
colspan: _col,
};
}
if (columnIndex === 1) {
//第二列報表事項的合並
this.getReMatterArr(this.pageData, "secondColumnKey");
const _row = this.reMatterArr[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
rowspan: _row,
colspan: _col,
};
}
},
getReMatterArr與getMatterArr 方法實際上是一個功能,但因為執行順序的原因所以分開了,暫時沒想到好的能合並到一起的方法。
secondColumnKey參數實際上是第一列數據標識+第二列標識組合形成的標識,這樣判斷就會在第一列相同的(也就是合並的狀態)時候才會進行第二列的合並。
