目標樣式:
首先先來看下我們拿到的返回數據:
scheduleList: [ { date: '第一天', journey: '報道', lecturer: '', }, { date: '第二天', journey: '企業生產安全應急預案數字化推演及復盤', lecturer: '國家危化品應急救援基地--林俊', }, { date: '第三天', journey: '火災應急處置', lecturer: '國家危化品應急救援基地—張學軍', }, { date: '第三天', journey: '中毒窒息事故應急處置', lecturer: '中化嶴山事故應急處置師資', }, { date: '第四天', journey: '人員觸電事故應急處置', lecturer: '中化嶴山事故應急處置師資', }, { date: '第四天', journey: '泄漏事故應急處置', lecturer: '中化嶴山事故應急處置師資', }, { date: '第四天', journey: '問題交流', lecturer: '中化嶴山事故應急處置師資', }, { date: '第五天', journey: '受限空間作業管理', lecturer: '中化嶴山危險作業內訓師', }, { date: '第五天', journey: '高處作業管理', lecturer: '中化嶴山危險作業內訓師', }, { date: '第五天', journey: '動火作業管理', lecturer: '中化嶴山危險作業內訓師', }, { date: '第五天', journey: '臨時用電作業管理', lecturer: '中化嶴山危險作業內訓師', }, { date: '第五天', journey: '問題交流與討論', lecturer: '中化嶴山危險作業內訓師', }, { date: '第六天', journey: '回城', lecturer: '', }, ],
rowIndex: '-1',
orderIndexArr: [],
hoverOrderArr: [],
html代碼結構:
<el-table :data="scheduleList" :span-method="objectSpanMethod" @cell-mouse-leave="cellMouseLeave" @cell-mouse-enter="cellMouseEnter" :cell-class-name="tableRowClassName" border > <el-table-column prop="date" label="時間" width="120"></el-table-column> <el-table-column prop="journey" label="行程" width="600"></el-table-column> <el-table-column prop="lecturer" label="講師"></el-table-column> </el-table>
js代碼:
1 methods: { 2 // 獲取相同編號的數組 3 getOrderNumber() { 4 const orderObj = {}; 5 this.scheduleList.forEach((item, index) => { 6 item.rowIndex = index; 7 if (orderObj[item.date]) { 8 orderObj[item.date].push(index); 9 } else { 10 orderObj[item.date] = []; 11 orderObj[item.date].push(index); 12 } 13 }); 14 // 將數組長度大於1的值 存儲到this.orderIndexArr(也就是需要合並的項) 15 Object.keys(orderObj).forEach((key) => { 16 if (orderObj[key].length > 1) { 17 this.orderIndexArr.push(orderObj[key]); 18 } 19 }); 20 }, 21 objectSpanMethod({ row, column, rowIndex, columnIndex }) { 22 if (columnIndex === 0 || columnIndex === 2) { 23 for (let i = 0; i < this.orderIndexArr.length; i += 1) { 24 let element = this.orderIndexArr[i]; 25 for (let j = 0; j < element.length; j += 1) { 26 let item = element[j]; 27 if (rowIndex === item) { 28 if (j === 0) { 29 return { 30 rowspan: element.length, 31 colspan: 1, 32 }; 33 } 34 if (j !== 0) { 35 return { 36 rowspan: 0, 37 colspan: 0, 38 }; 39 } 40 } 41 } 42 } 43 } 44 }, 45 tableRowClassName({ row, rowIndex }) { 46 let arr = this.hoverOrderArr; 47 for (let i = 0; i < arr.length; i += 1) { 48 if (rowIndex === arr[i]) { 49 return 'hovered-row'; 50 } 51 } 52 }, 53 cellMouseEnter(row, column, cell, event) { 54 this.rowIndex = row.rowIndex; 55 this.hoverOrderArr = []; 56 this.orderIndexArr.forEach((element) => { 57 if (element.indexOf(this.rowIndex) >= 0) { 58 this.hoverOrderArr = element; 59 } 60 }); 61 }, 62 cellMouseLeave(row, column, cell, event) { 63 this.rowIndex = '-1'; 64 this.hoverOrderArr = []; 65 } 66 } 67 mounted() { 68 this.getOrderNumber(); 69 },
css部分:
1 .el-table { 2 /deep/ .hovered-row { 3 background: #f5f7fa; 4 } 5 }