需求
vue表格同列不同行的相同內容合併單元格,直接看圖更直觀。
原表格
效果很明顯,後一列的合併項受前一項的合併項的限制。
實現
廢話不多說,直接上程式碼
<template>
<div class="table_box">
<table class="table">
<thead>
<tr>
<th>序號</th>
<th>名字</th>
<th>性別</th>
<th>年齡</th>
<th>地址</th>
<th>興趣</th>
<th>電話</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in data" :key="index">
<td>{{index}}</td>
<td ref="td">{{item.name}}</td>
<td ref="td">{{item.sex}}</td>
<td ref="td">{{item.age}}</td>
<td ref="td">{{item.address}}</td>
<td ref="td">{{item.habit}}</td>
<td ref="td">{{item.tel}}</td>
</tr>
</tbody>
</table>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
data () {
return {
data: [
{name: '小明', sex: '男', age: '24', address: '湖北', habit: '籃球', tel: '15927001701'},
{name: '小明', sex: '男', age: '24', address: '湖北', habit: '籃球', tel: '15927001702'},
{name: '小明', sex: '男', age: '24', address: '湖北', habit: '足球', tel: '15927001703'},
{name: '小明', sex: '男', age: '24', address: '湖南', habit: '籃球', tel: '15927001704'},
{name: '小明', sex: '男', age: '23', address: '湖南', habit: '籃球', tel: '15927001705'},
{name: '小明', sex: '男', age: '23', address: '湖北', habit: '籃球', tel: '15927001706'},
{name: '小明', sex: '男', age: '24', address: '湖北', habit: '籃球', tel: '15927001707'},
{name: '小明', sex: '女', age: '24', address: '湖北', habit: '籃球', tel: '15927001708'},
{name: '小紅', sex: '女', age: '24', address: '湖北', habit: '籃球', tel: '15927001709'},
{name: '小紅', sex: '女', age: '24', address: '湖南', habit: '籃球', tel: '15927001700'}
]
}
},
mounted() {
this.merge()
},
methods: {
merge()
// 如果資料是亂序,整理順序,按自己的資料結構排序
// this.data.sort((a,b) => {
// return JSON.stringify(a) >=JSON.stringify(b)?1:-1;
// })
// console.log(this.data)
this.$nextTick(() => {
var tds = this.$refs.td;
console.log(tds)
let n=0; // 每次合併單元格從第幾行開始合併
for(let col=0,collen=6; col<collen;col++) {
n=0;
for(let row=0,len=this.data.length; row<len;row++) {
if(n!=row && tds[col+n*collen].innerHTML == tds[col+row*collen].innerHTML) {
if(col!=0) {
if(tds[col+row*collen-1].rowSpan == 0){ // 前一列被合併,才能進行此列合併
tds[col+n*collen].rowSpan = tds[col+n*collen].rowSpan + 1;
tds[col+row*collen].rowSpan = 0;
tds[col+row*collen].hidden = true;
}else {
n=row; // 合併中止,重置開始合併行
}
}else {
tds[col+n*collen].rowSpan = tds[col+n*collen].rowSpan + 1;
tds[col+row*collen].rowSpan = 0;
tds[col+row*collen].hidden = true;
}
}else {
n=row; // 合併中止,重置開始合併行
}
}
}
})
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="less">
.table_box{
.table{
border: 1px solid #cccccc;
border-collapse: collapse;
th{
// align-items: center;
padding: 10px 20px;
border: 1px solid #cccccc;
text-align: left;
}
td{
padding: 10px 20px;
border: 1px solid #cccccc;
text-align: left;
}
}
}
</style>
複製程式碼