原始表格及代码
< el-table
:data = " tableData"
class = " myTable"
header-row-class-name = " tableHead"
>
< el-table-column prop = " date" label = " 日期" > </ el-table-column>
< el-table-column prop = " name" label = " 姓名" > </ el-table-column>
< el-table-column prop = " project" label = " 项目" > </ el-table-column>
< el-table-column prop = " address" label = " 地址" min-width = " 200" >
</ el-table-column>
</ el-table>
getDataMock ( ) {
for ( var i = 0 ; i < 10 ; i++ ) {
let randomDay = Math. floor ( Math. random ( ) * 5 + 1 ) ;
this . tableData. push ( {
date : "2024-12-" + randomDay,
name : "王小虎" + i,
project : "项目" + i,
address : "上海市普陀区金沙江路 " + i + " 弄" ,
} ) ;
}
this . tableData. sort ( ( a, b ) => {
let time1 = new Date ( a. date) . getTime ( ) ;
let time2 = new Date ( b. date) . getTime ( ) ;
return time1 - time2;
} ) ;
} ,
.myTable {
width : 700px;
margin : 0 auto;
border-radius : 20px;
.tableHead {
.el-table__cell {
background-color : #bee7c5;
color : #264f30;
border-bottom : none;
&:first-child {
background : #435f5b;
color : #fff;
}
}
}
.el-table__body {
.el-table__row {
.el-table__cell {
background : #f7f7f7;
border-bottom : 1px solid #dcdcdc;
&:first-child {
background : #acb2d9;
color : #32405b;
font-weight : bold;
border-bottom : 1px solid #32405b;
}
}
}
}
}
合并行
需要动态计算表格数据的合并行数 如图所示,需要得到如下的 rowspan 计算表格数据每行的 rowspan
getTableDataSpan ( arr ) {
let spanData = [ ] ;
let lastRowIndex = 0 ;
arr. forEach ( ( item, index ) => {
if ( index == 0 ) {
spanData. push ( 1 ) ;
} else {
if ( item. date == arr[ index - 1 ] . date) {
spanData. push ( 0 ) ;
spanData[ lastRowIndex] += 1 ;
} else {
spanData. push ( 1 ) ;
lastRowIndex = index;
}
}
} ) ;
return {
spanData : spanData,
lastRowIndex : lastRowIndex,
} ;
} ,
< el-table
:data = " tableData"
class = " myTable"
header-row-class-name = " tableHead"
:span-method = " spanMethod"
>
...
spanMethod ( { row, column, rowIndex, columnIndex } ) {
if ( columnIndex === 0 ) {
let rowspan = this . getTableDataSpan ( this . tableData) . spanData[ rowIndex] ;
let colspan = rowspan === 0 ? 0 : 1 ;
return {
rowspan : rowspan,
colspan : colspan,
} ;
}
} ,
样式调整优化
上述代码得到如下效果 原因是被合并的行,删掉了首列,被赋予了 first-child 的样式
< el-table
:data = " tableData"
class = " myTable"
header-row-class-name = " tableHead"
:span-method = " spanMethod"
:cell-class-name = " cellClassName"
>
...
cellClassName ( { row, column, rowIndex, columnIndex } ) {
if ( columnIndex === 0 ) {
return "colorBox" ;
}
} ,
.el-table__body {
.el-table__row {
.el-table__cell {
background : #f7f7f7;
border-bottom : 1px solid #dcdcdc;
&.colorBox {
background : #acb2d9;
color : #32405b;
font-weight : bold;
border-bottom : 1px solid #32405b;
}
}
}
}
效果如图,会发现,动态赋予的 colorBox 类名,并没有被加到被合并的行的首列元素上
完整代码段
< template>
< div class = " tableBox" >
< el-table
:data = " tableData"
class = " myTable"
header-row-class-name = " tableHead"
:span-method = " spanMethod"
:cell-class-name = " cellClassName"
>
< el-table-column prop = " date" label = " 日期" > </ el-table-column>
< el-table-column prop = " name" label = " 姓名" > </ el-table-column>
< el-table-column prop = " project" label = " 项目" > </ el-table-column>
< el-table-column prop = " address" label = " 地址" min-width = " 200" >
</ el-table-column>
</ el-table>
</ div>
</ template>
< script>
export default {
name : "dataList" ,
components : { } ,
data ( ) {
return {
tableData : [ ] ,
} ;
} ,
mounted ( ) {
this . getDataMock ( ) ;
} ,
methods : {
getDataMock ( ) {
for ( var i = 0 ; i < 10 ; i++ ) {
let randomDay = Math. floor ( Math. random ( ) * 5 + 1 ) ;
this . tableData. push ( {
date : "2024-12-" + randomDay,
name : "王小虎" + i,
project : "项目" + i,
address : "上海市普陀区金沙江路 " + i + " 弄" ,
} ) ;
}
this . tableData. sort ( ( a, b ) => {
let time1 = new Date ( a. date) . getTime ( ) ;
let time2 = new Date ( b. date) . getTime ( ) ;
return time1 - time2;
} ) ;
} ,
cellClassName ( { row, column, rowIndex, columnIndex } ) {
if ( columnIndex === 0 ) {
return "colorBox" ;
}
} ,
spanMethod ( { row, column, rowIndex, columnIndex } ) {
if ( columnIndex === 0 ) {
let rowspan = this . getTableDataSpan ( this . tableData) . spanData[ rowIndex] ;
let colspan = rowspan === 0 ? 0 : 1 ;
return {
rowspan : rowspan,
colspan : colspan,
} ;
}
} ,
getTableDataSpan ( arr ) {
let spanData = [ ] ;
let lastRowIndex = 0 ;
arr. forEach ( ( item, index ) => {
if ( index == 0 ) {
spanData. push ( 1 ) ;
} else {
if ( item. date == arr[ index - 1 ] . date) {
spanData. push ( 0 ) ;
spanData[ lastRowIndex] += 1 ;
} else {
spanData. push ( 1 ) ;
lastRowIndex = index;
}
}
} ) ;
return {
spanData : spanData,
lastRowIndex : lastRowIndex,
} ;
} ,
} ,
} ;
</ script>
< style lang = " less" scoped >
.tableBox {
background : #fff;
padding : 50px 0;
/deep/ .myTable {
width : 700px;
margin : 0 auto;
border-radius : 20px;
.tableHead {
.el-table__cell {
background-color : #bee7c5;
color : #264f30;
border-bottom : none;
&:first-child {
background : #435f5b;
color : #fff;
}
}
}
.el-table__body {
.el-table__row {
.el-table__cell {
background : #f7f7f7;
border-bottom : 1px solid #dcdcdc;
&.colorBox {
background : #acb2d9;
color : #32405b;
font-weight : bold;
border-bottom : 1px solid #32405b;
}
}
}
}
}
}
</ style>