效果图
一、html
< template> < div> < a- table : columns= "columns" : dataSource= "dataSource" rowKey= "id" : pagination= "false" bordered> < template slot= "content1" slot- scope= "text" > { { text} } < / template> < / a- table> < / div>
< / template>
二、js
export default { data ( ) { return { sortLevel : [ 'date' ] , columns : [ { title : '日期' , align : 'center' , dataIndex : 'date' , key : 'date' , customRender : this . dateRender, } , { title : '内容' , colSpan : 2 , dataIndex : 'content' , scopedSlots : { customRender : 'content1' } , } , { title : '内容' , colSpan : 0 , dataIndex : 'content2' , } , ] , datas : [ { id : 1 , content : '123' , content2 : 'qqw' , date : '周一' } , { id : 2 , content : '123' , content2 : 'qwqw' , date : '周二' } , { id : 3 , content : '123' , content2 : 'wewe' , date : '周一' } , , { id : 42 , content : '12332' , content2 : 'sad' , date : '周三' } , , { id : 52 , content : '1223' , content2 : 'asdasd' , date : '周一' } ] , dataSource : [ ] } } , mounted ( ) { this . dataSource = this . convertData ( this . datas) console. log ( ' this.dataSource : ' , this . dataSource) ; } , methods : { dateRender ( value, row, index ) { return { children : value, attrs : { rowSpan : row. dateRowSpan} , } ; } , convertData ( arr, levelIndex = 0 ) { const levelKey = this . sortLevelconst key = levelKey[ levelIndex] let groupObj = this . groupBy ( arr, key) || { } ; Object. keys ( groupObj) . forEach ( groupKey => { if ( levelIndex < levelKey. length - 1 ) { groupObj[ groupKey] = this . convertData ( groupObj[ groupKey] , levelIndex + 1 ) } groupObj[ groupKey] . forEach ( ( item, index, arr ) => { item[ ` ${ key} RowSpan ` ] = index === 0 ? arr. length : 0 } ) } ) return Object. values ( groupObj) . flat ( ) } , groupBy ( arr = [ ] , key ) { let obj = { } arr. forEach ( item => { const val = item[ key] if ( ! obj[ val] ) { obj[ val] = [ ] } obj[ val] . push ( item) } ) return obj} , } ,
}
三、完整代码
< template> < div> < a- table : columns= "columns" : dataSource= "dataSource" rowKey= "id" : pagination= "false" bordered> < / a- table> < / div>
< / template> < script> export default { data ( ) { const renderContent = ( value, row, index ) => { const obj = { children : value, attrs : { } , } ; if ( index === 3 ) { obj. attrs. colSpan = 0 ; } return obj; } ; return { sortLevel : [ 'date' ] , columns : [ { title : '日期' , align : 'center' , dataIndex : 'date' , key : 'date' , customRender : this . dateRender, } , { title : '内容' , colSpan : 2 , dataIndex : 'content' , } , { title : '内容' , colSpan : 0 , dataIndex : 'content2' , } , ] , datas : [ { id : 1 , content : '123' , content2 : 'qqw' , date : '周一' } , { id : 2 , content : '123' , content2 : 'qwqw' , date : '周二' } , { id : 3 , content : '123' , content2 : 'wewe' , date : '周一' } , , { id : 42 , content : '12332' , content2 : 'sad' , date : '周三' } , , { id : 52 , content : '1223' , content2 : 'asdasd' , date : '周一' } ] , dataSource : [ ] } } , mounted ( ) { this . dataSource = this . convertData ( this . datas) console. log ( ' this.dataSource : ' , this . dataSource) ; } , methods : { dateRender ( value, row, index ) { return { children : value, attrs : { rowSpan : row. dateRowSpan} , } ; } , convertData ( arr, levelIndex = 0 ) { const levelKey = this . sortLevelconst key = levelKey[ levelIndex] let groupObj = this . groupBy ( arr, key) || { } ; Object. keys ( groupObj) . forEach ( groupKey => { if ( levelIndex < levelKey. length - 1 ) { groupObj[ groupKey] = this . convertData ( groupObj[ groupKey] , levelIndex + 1 ) } groupObj[ groupKey] . forEach ( ( item, index, arr ) => { item[ ` ${ key} RowSpan ` ] = index === 0 ? arr. length : 0 } ) } ) return Object. values ( groupObj) . flat ( ) } , groupBy ( arr = [ ] , key ) { let obj = { } arr. forEach ( item => { const val = item[ key] if ( ! obj[ val] ) { obj[ val] = [ ] } obj[ val] . push ( item) } ) return obj} , } ,
}
< / script>
< style lang= "less" scoped> < / style> ` ` `