vue element table表格相同名稱列合并方式
element table表格相同名稱列合并

<template>
<div>
<el-table show-summary :summary-method="getSummaries" :span-method="objectSpanMethod" :data="tableData" row-key="id" ref="tableDom" border>
<el-table-column label="序號(hào)" width="55" align="center">
<template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column>
<el-table-column prop="name" label="分類" align="center"></el-table-column>
<el-table-column prop="num1" label="數(shù)量1" align="center"></el-table-column>
<el-table-column prop="num2" label="數(shù)量2" align="center"></el-table-column>
<el-table-column prop="num3" label="數(shù)量3" align="center"></el-table-column>
<el-table-column prop="type" label="類型" align="center"></el-table-column>
<el-table-column prop="num4" label="數(shù)量4" align="center"></el-table-column>
<el-table-column prop="num5" label="數(shù)量5" align="center"></el-table-column>
</el-table>
</div>
</template>
<script>
export default {
name: '',
components: {},
props: {},
data() {
return {
tableData: [{
name: '名稱1',
num1: '2',
num2: '3',
num3: '4',
num4: '連續(xù)',
num5: '6',
num6: '7',
}, {
name: '名稱2',
num1: '2',
num2: '3',
num3: '4',
num4: '連續(xù)',
num5: '6',
num6: '7',
}, {
name: '名稱2',
num1: '2',
num2: '3',
num3: '4',
num4: '連續(xù)',
num5: '6',
num6: '7',
}, {
name: '名稱3',
num1: '2',
num2: '3',
num3: '4',
num4: '連續(xù)',
num5: '6',
num6: '7',
}, {
name: '名稱4',
num1: '2',
num2: '3',
num3: '4',
num4: '連續(xù)',
num5: '6',
num6: '7',
}, {
name: '名稱4',
num1: '2',
num2: '3',
num3: '4',
num4: '連續(xù)',
num5: '6',
num6: '7',
}]
}
},
filters: {},
computed: {},
watch: {},
created() {},
mounted() {},
beforeDestroy() {},
methods: {
// 合計(jì)
getSummaries (param) {
const { columns, data } = param
const sums = []
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合計(jì)'
} else if (index === 2 || index === 7) {
const values = data.map(item => Number(item[column.property]))
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr)
if (!isNaN(value)) {
return prev + curr
} else {
return prev
}
}, 0)
} else {
sums[index] = ''
}
} else {
sums[index] = ''
}
})
return sums
},
// table合并列
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
let data = this.tableData; //拿到當(dāng)前table中數(shù)據(jù)
let cellValue = row[column.property]; //當(dāng)前位置的值
let noSortArr = ['num1', 'num2', 'num3', 'num4', 'num5', 'num6']; //不需要合并的字段(不進(jìn)行合并行的prop)
if (cellValue && !noSortArr.includes(column.property)) {
let prevRow = data[rowIndex - 1]; //獲取到上一條數(shù)據(jù)
let nextRow = data[rowIndex + 1]; //下一條數(shù)據(jù)
if (prevRow && prevRow[column.property] === cellValue) { //當(dāng)有上一條數(shù)據(jù),并且和當(dāng)前值相等時(shí)
return { rowspan: 0, colspan: 0 };
} else {
let countRowspan = 1;
while (nextRow && nextRow[column.property] === cellValue) { //當(dāng)有下一條數(shù)據(jù)并且和當(dāng)前值相等時(shí),獲取新的下一條
nextRow = data[++countRowspan + rowIndex];
}
if (countRowspan > 1) {
return { rowspan: countRowspan, colspan: 1 };
}
}
}
},
}
}
</script>
<style scoped lang="less">
</style>
對(duì)table表格相同內(nèi)容行的合并
在vue開(kāi)發(fā)中會(huì)有對(duì)表格的操作,有時(shí)因?yàn)樾枰闅v的情況不同,對(duì)于數(shù)據(jù)相同行處理時(shí),使用element的table不太好實(shí)現(xiàn),還是使用html的table標(biāo)簽!
而此時(shí),對(duì)于相同數(shù)據(jù)行,使用rowspan進(jìn)行合并則無(wú)法更好的遍歷數(shù)據(jù),比如我們要實(shí)現(xiàn)這樣的表格

數(shù)據(jù)格式一看,使用遍歷的話會(huì)更好實(shí)現(xiàn),這個(gè)時(shí)候表格是這樣的

這個(gè)時(shí)候可以使用方法獲取相同內(nèi)容行,對(duì)其進(jìn)行處理,方法如下
mergeTable() { //table表合并相同內(nèi)容的行
var tab = document.getElementById("subtable");
var maxCol = 3, val, count, start;
// var ys = "";
for (var col = maxCol - 1; col >= 0 ; col--) {
count = 1;
val = "";
for (var i = 0; i < tab.rows.length; i++) {
if (val == tab.rows[i].cells[col].innerHTML) {
count++;
} else {
if (count > 1) {
//合并
start = i - count;
tab.rows[start].cells[col].rowSpan = count;
for (var j = start + 1; j < i; j++) { //
tab.rows[j].cells[col].style.display = "none";
tab.rows[j].removeChild(tab.rows[j].cells[col]);
}
count = 1;
}
val = tab.rows[i].cells[col].innerHTML;
}
}
if (count > 1) { //合并,最后幾行相同的情況下
start = i - count;
tab.rows[start].cells[col].rowSpan = count;
for (var j = start + 1; j < i; j++) {
tab.rows[j].removeChild(tab.rows[j].cells[col]);
}
}
}
}然后在生命周期函數(shù)這調(diào)用該方法即可實(shí)現(xiàn)對(duì)相同內(nèi)容行的合并操作!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
uniapp實(shí)現(xiàn)紅包動(dòng)畫(huà)效果代碼實(shí)例(vue3)
uniapp作為一種基于Vue.js的前端框架,實(shí)現(xiàn)了一套代碼多端運(yùn)行的理念,成為了眾多開(kāi)發(fā)者的首選,下面這篇文章主要給大家介紹了關(guān)于uniapp實(shí)現(xiàn)紅包動(dòng)畫(huà)效果的相關(guān)資料,需要的朋友可以參考下2024-01-01
使用window.open和vue router新開(kāi)頁(yè)面
這篇文章主要介紹了使用window.open和vue router新開(kāi)頁(yè)面方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
vue如何導(dǎo)出文件流獲取附件名稱并下載(在response.headers里解析filename導(dǎo)出)
這篇文章主要介紹了vue如何導(dǎo)出文件流獲取附件名稱并下載(在response.headers里解析filename導(dǎo)出),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
如何使用 vue-cli 創(chuàng)建模板項(xiàng)目
這篇文章主要介紹了如何使用 vue-cli 創(chuàng)建模板項(xiàng)目,幫助大家更好的理解和學(xué)習(xí)vue框架的知識(shí),感興趣的朋友可以了解下2020-11-11
vue-router報(bào)錯(cuò):uncaught error during route 
這篇文章主要介紹了vue-router報(bào)錯(cuò):uncaught error during route navigati問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
解決vue-cli + webpack 新建項(xiàng)目出錯(cuò)的問(wèn)題
下面小編就為大家分享一篇解決vue-cli + webpack 新建項(xiàng)目出錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
vue中Npm run build 根據(jù)環(huán)境傳遞參數(shù)方法來(lái)打包不同域名
這篇文章主要介紹了vue項(xiàng)目中Npm run build 根據(jù)環(huán)境傳遞參數(shù)方法來(lái)打包不同域名,使用npm run build --xxx,根據(jù)傳遞參數(shù)xxx來(lái)判定不同的環(huán)境,給出不同的域名配置,具體內(nèi)容詳情大家參考下本文2018-03-03

