一、功能分析
產品經理要求企微主體名稱是配置項且後期可修改或增加,各企微主體賬號的資料一對應。
前端開發設計方案為:靜態列(左部分)在前端寫,配置項由後端介面返回,再動態追加到columns中,根據表頭dataIndex對應的資料項,填充到資料陣列dataSource。
至此,開發思路出來了,開始動手寫程式碼!
二、功能程式碼
1. 表格元件:關鍵屬性 :columns="columns"
<a-table ref="table" bordered :columns="columns" :dataSource="tableData" :row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }" :loading="loading" :pagination="false" :scroll="{y: tableHeight-82, x:'max-content'}" :style="{ height: tableHeight+ 'px' }" class="table-list" > </a-table>
2. script部分:
columns 在data(){} 定義靜態列。
表頭分組顯示 企微名稱及分組資料,主要是 children 陣列實現,注意:dataIndex值不能重複!
queryList() { GetEntityList().then(res => { let { data } = res.data let result = data && data.length ? data.sort((a1, a2) => a1.sort - a2.sort) : [] // 企微主體名稱按照sort順序展示 let isSubjectSame = false // 判斷企微主體是否一樣 if (JSON.stringify(result) != JSON.stringify(this.entityList)) isSubjectSame = true this.entityList = result result.forEach((rs, index) => { let i = index + 1 let obj = { id: rs.subjectId, title: rs.subjectName, accountIndex: i, children: [ // 分組結構 { title: '分組1', dataIndex: 'alreadyTotal' + i, // 表頭dataIndex,對應dataSource key: 'alreadyTotal' + i, // 注意 i 值 width: 100, // 一定要設定分組寬度 scopedSlots: { customRender: 'alreadyTotalSlot' } // 表格template插槽內容 }, { title: '分組2', dataIndex: 'answerTotal' + i, key: 'answerTotal' + i, width: 100, scopedSlots: { customRender: 'answerTotalSlot' } }, { title: '分組3', dataIndex: 'balanceTotal' + i, key: 'balanceTotal' + i, width: 100, scopedSlots: { customRender: 'balanceTotalSlot' } }, ], }
// 表頭陣列追加到columns if (isSubjectSame) { this.columns.splice(4 + index, 0, obj) } this.accountData.push(obj) }); this.$nextTick(() => { this.queryPage() }) }).catch(err => { this.accountData = [] this.queryPage() }) }
獲取表格資料dataSource
queryPage() { GetAccountList().then(res => { let { data } = res.data data.list.forEach(rs => { rs.accountDetailList.map(ad => { let accountObj = this.accountData.filter(el => el.id == ad.subjectId) if (accountObj && accountObj.length) { let j = accountObj[0].accountIndex let balanceTotal = ad.answerTotal - ad.alreadyTotal rs['alreadyTotal' + j] = ad.alreadyTotal // 對應表頭的dataIndex rs['answerTotal' + j] = ad.answerTotal // 注意 j 值 rs['balanceTotal' + j] = balanceTotal ? parseFloat(balanceTotal.toFixed(4)) : balanceTotal } return ad }) }) this.tableData = data.list this.total = data.count.value }).catch(err => { this.tableData = [] this.total = 0 })
結束寫程式碼,註釋都加上了,哈哈哈~