詳解js如何優(yōu)雅處理后端返回的單元格數(shù)據(jù)
我們需要渲染一個4行3列的表格,我們只需要配置好columns:[{},{},{}],數(shù)據(jù)dataSource:[{},{},{},{}],當(dāng)我們columns中對象的屬性與dataSource中對象的屬性對應(yīng)時,就可以正常渲染數(shù)據(jù)啦。但是當(dāng)我們的后端不是以每行數(shù)據(jù)進行返回,而是將每個單元格的數(shù)據(jù)作為一個對象返回時,我們就要自己按行處理數(shù)據(jù)了。接下來分享一下我的思路。
解題思路: 1、不管后端返回給我們多少條數(shù)據(jù),我們只需要明確我們需要的是幾行數(shù)據(jù),也就是需要定義包含幾個對象的數(shù)組。 2、根據(jù)后端返回每個單元格中的兩個字段唯一確定行和列。再根據(jù)行列取出對應(yīng)單元格數(shù)據(jù)添加到剛才創(chuàng)建的數(shù)組中,就可以成功渲染數(shù)據(jù)了。
具體實現(xiàn):
1.定義tableColumns:我這里的列和行相等,是動態(tài)的數(shù)據(jù)根據(jù)num進行遍歷渲染得到
computed: { tableColumns() { this.list = [] let columnsTemp = public_deepCopy(this.columns); for (let i = 0; i < this.num; i++) { this.list.push({ title: i + 1, dataIndex: i + 1, key: i + 1, align: 'center', scopedSlots: {customRender: i + 1} }); } columnsTemp.push(...this.list) return columnsTemp } }
2.定義一個函數(shù),用來初始化行,方便處理后端返回的數(shù)據(jù)
先來看一下后端返回數(shù)據(jù)格式
我這里的num和sort就可以唯一確定是哪個單元格,num代表行號,sort代表列號
接下來我們開始定義函數(shù)初始化行數(shù)據(jù)
getArray(arr) { // 初始化行,這里根據(jù)num的值確定需要幾行,創(chuàng)建包含幾個對象的空數(shù)據(jù) const rows = Array.from({length: this.num}, () => ({})); // 根據(jù)num也就是行數(shù)-1,確定索引,我們可以知道像一行添加數(shù)據(jù),在將sort作為對象的屬性名,item作為屬性值將數(shù)據(jù)存儲到對應(yīng)的位置 arr.forEach(item => { rows[item.num - 1][item.sort] = { ...item, score: item.numerator && item.denominator ? item.numerator + '/' + item.denominator : '' }; }); // 因為有的單元格沒有數(shù)據(jù),所以進行判斷將空位置填充為null rows.forEach(row => { for (let i = 1; i <= this.num; i++) { if (!row.hasOwnProperty(i)) { row[i] = null; } } }); //最后將處理好的數(shù)據(jù)返回 return rows; },
調(diào)接口處理數(shù)據(jù)
async queryTemplate() { this.loading = true const res = await queryWorkAllocationModule({ moduleId: this.moduleId }); this.loading = false; if (res.state === 200) { this.dataSource = this.getArray(res.data); } else { this.$message.error(res.message) } },
處理好的數(shù)據(jù)結(jié)構(gòu)就是這樣啦,這樣就可以跟我們上面定義的tableColumns數(shù)組包含的對象屬性進行一一對應(yīng)了
渲染數(shù)據(jù)
<a-table :columns="tableColumns" :data-source="dataSource" :loading="loading" :pagination="false" :rowKey="record => record.id" bordered > <template slot="headerName"> <div style="position:relative;width:100px;"> <div style="text-align: right;">排名</div> <div style="text-align: left;">人數(shù)</div> </div> </template> <template slot="header" slot-scope="text, record, index"> {{ index + 1 }} </template> <template v-for="item in num" :slot="item" slot-scope="text, record, index"> <a-input v-if="record[item] && commenttype" :key="index" v-model="text.score" placeholder="請輸入" style="text-align: center;border: none"></a-input> <span v-if="record[item] && !commenttype">{{ text.score }}</span> </template> </a-table>
最后放上最終效果圖展示
數(shù)據(jù)處理完成,表格可以正確的被渲染出來了。
到此這篇關(guān)于詳解js如何優(yōu)雅處理后端返回的單元格數(shù)據(jù)的文章就介紹到這了,更多相關(guān)js處理后端返回數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
單元測試框架Jest搭配TypeScript的安裝與配置方式
這篇文章主要介紹了單元測試框架Jest搭配TypeScript的安裝與配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01新人報道,發(fā)個小技巧(js數(shù)組重復(fù)判斷)
js數(shù)組重復(fù)判斷2008-10-10JavaScript 實現(xiàn)完美兼容多瀏覽器的復(fù)制功能代碼
這兩天在做Web前端時,遇到需求通過js實現(xiàn)文本復(fù)制的功能。經(jīng)過一番測試,終于實現(xiàn)了出來,有需要的小伙伴可以參考下。2015-04-04IE6-IE9不支持table.innerHTML的解決方法分享
讓ie6-ie9支持table.innerHTML,其實這里只是對table做了處理,對其他不支持的元素可以用類似的方案2012-09-09關(guān)于ckeditor在bootstrap中modal中彈框無法輸入的解決方法
今天小編就為大家分享一篇關(guān)于ckeditor在bootstrap中modal中彈框無法輸入的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09webpack圖片轉(zhuǎn)為base64的實現(xiàn)示例
在開發(fā)過程中,圖片轉(zhuǎn)成base64是常有的事,本文主要介紹了webpack圖片轉(zhuǎn)為base64的實現(xiàn)示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12詳解CocosCreator優(yōu)化之DrawCall
這篇文章主要介紹了CocosCreator中DrawCall的優(yōu)化,想研究游戲性能的同學(xué),一定要看一看2021-04-04為JavaScript提供睡眠功能(sleep) 自編譯JS引擎
如何在js中讓函數(shù)睡眠多少秒? 經(jīng)常會有Javascript初學(xué)者提出這樣的問題,自從js出現(xiàn)以來.2010-08-08JS控件ASP.NET的treeview控件全選或者取消(示例代碼)
本篇文章主要是對JS控件ASP.NET的treeview控件全選或者取消的示例代碼進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12JS實現(xiàn)點擊表頭表格自動排序(含數(shù)字、字符串、日期)
這篇文章主要介紹了利用JS如何實現(xiàn)點擊表頭后表格自動排序,其中包含數(shù)字排序、字符串排序以及日期格式的排序,文中給出了完整的示例代碼,相信對大家具有一定的參考價值,感興趣的朋友們一起來看看吧。2017-01-01