vue實(shí)現(xiàn)行列轉(zhuǎn)換的一種方法
行列轉(zhuǎn)換是一個(gè)老生常談的問(wèn)題,這幾天逛知乎有遇到了這個(gè)問(wèn)題。一個(gè)前端說(shuō),拿到的數(shù)據(jù)是單列的需要做轉(zhuǎn)換才能夠綁定,折騰了好久才搞定,還說(shuō)這個(gè)應(yīng)該后端直接出數(shù)據(jù),不應(yīng)該讓前端折騰。
這個(gè)嘛,行列轉(zhuǎn)換在后端也不是很好解決的問(wèn)題,而且還有一個(gè)性能的問(wèn)題,綜合考慮,我還是覺(jué)得應(yīng)該由前端進(jìn)行行列轉(zhuǎn)換。光說(shuō)不練假把式,所以拿出來(lái)代碼僅作為拋磚引玉,供大家參考一下,如果有更好的方法,歡迎一起來(lái)探討。
1、模板設(shè)計(jì)。
<div id="app"> <table class="table_default1" style="width: 400px;"> <tr> <th v-for="item in tableHeader"> {{item}} </th> </tr> <tr v-for="tr in tableBody"> <td v-for="td in tr"> {{td}} </td> </tr> </table> </div>
這個(gè)比較簡(jiǎn)單,先遍歷 tableHeader 把表頭循環(huán)出來(lái)。
然后在雙重遍歷,tableBody 提供行數(shù)據(jù),然后在遍歷出來(lái)td。
這里沒(méi)有任何與業(yè)務(wù)邏輯相關(guān)的代碼,也就是說(shuō)這個(gè)模板可以適合任何行列轉(zhuǎn)換的需求??梢越壎ǔ鰜?lái) m行n列 的表格。
2、然后是vue實(shí)例部分
var form = new Vue({ el: "#app", data: { tableHeader: { }, //綁定表頭 tableBody: { } //綁定數(shù)據(jù) }, created: function () { //代碼在下面 } });
這里data的兩個(gè)成員都是空的,因?yàn)槠浣Y(jié)構(gòu)要根據(jù)后臺(tái)傳遞過(guò)來(lái)的數(shù)據(jù)決定,所以這里就不寫(xiě)了,當(dāng)然 tableHeader 和 tableBody 還是要先寫(xiě)一下占個(gè)位置,否則模板的地方就沒(méi)法寫(xiě)了。
不過(guò)還是先寫(xiě)一個(gè)結(jié)構(gòu)參考一下,否則下面的代碼估計(jì)看著會(huì)比較暈
2.1 tableHeader 的結(jié)構(gòu)。這個(gè)很簡(jiǎn)單了。
{ name: "姓名", studentID: "學(xué)號(hào)", "數(shù)學(xué)": "數(shù)學(xué)", "物理": "物理", "英語(yǔ)": "英語(yǔ)", "語(yǔ)文": "語(yǔ)文", }
2.2 tableBody 的結(jié)構(gòu)。這里并沒(méi)有使用數(shù)組,因?yàn)閿?shù)組不好定位,用key的方式可以很方便的定位,key值的規(guī)律就是 標(biāo)識(shí) + 學(xué)號(hào),比如s1。純數(shù)字作為key,可能會(huì)有點(diǎn)問(wèn)題,所以就加了個(gè)標(biāo)識(shí)。
對(duì)了,可以多一個(gè)科目的,比如“物理”,只要tableHeader里面有就可以。
{ s1: { studentID: 1, name: "小紅", 數(shù)學(xué): 200, 語(yǔ)文: 190, 英語(yǔ): 191 } s2: { studentID: 2, name: "小明", 數(shù)學(xué): 193, 語(yǔ)文: 187, 英語(yǔ): 188, 物理: 99 } s3: { studentID: 3, name: "韓梅梅", 數(shù)學(xué): 194, 語(yǔ)文: 199, 英語(yǔ): 198 } }
3、最后是轉(zhuǎn)換函數(shù)
//得到測(cè)試數(shù)據(jù) var testdata = [ { studentID: 0001, name: '小紅', subject: '數(shù)學(xué)', mark: 100 }, { studentID: 0001, name: '小紅', subject: '語(yǔ)文', mark: 90 }, { studentID: 0001, name: '小紅', subject: '英語(yǔ)', mark: 91 }, { studentID: 0002, name: '小明', subject: '數(shù)學(xué)', mark: 93 }, { studentID: 0002, name: '小明', subject: '語(yǔ)文', mark: 87 }, { studentID: 0002, name: '小明', subject: '英語(yǔ)', mark: 88 }, { studentID: 0002, name: '小明', subject: '物理', mark: 88 }, { studentID: 0003, name: '韓梅梅', subject: '數(shù)學(xué)', mark: 94 }, { studentID: 0003, name: '韓梅梅', subject: '語(yǔ)文', mark: 99 }, { studentID: 0003, name: '韓梅梅', subject: '英語(yǔ)', mark: 98 } ]; //第一次遍歷,制作 tableHeader var th = {} th["studentID"] = '學(xué)號(hào)'; //固定列 th["name"] = '姓名'; //篩選科目 var thKey = {} for (var i = 0; i < testdata.length; i++) { thKey[testdata[i].subject] = 1; //動(dòng)態(tài)列 } //把科目加到th里面 ,動(dòng)態(tài)增加列 for (var key in thKey) { th[key] = key; } this.tableHeader = th; //第二次遍歷,制作tr的行 var tr = {}; for (var i = 0; i < testdata.length; i++) { var d = testdata[i]; tr['s' + d.studentID] = { studentID: d.studentID, //固定列 name: d.name } } //第三次遍歷,添加科目的成績(jī) for (var i = 0; i < testdata.length; i++) { var d = testdata[i]; tr['s' + d.studentID][d.subject] = d.mark + 100; //動(dòng)態(tài)列 } this.tableBody = tr;
這個(gè)可以寫(xiě)在 created 里面,當(dāng)然寫(xiě)在其他地方也可以,只要把數(shù)據(jù)給過(guò)去就行。
前面是給了一個(gè)測(cè)試數(shù)據(jù),數(shù)據(jù)結(jié)構(gòu)并不僅限于這樣,改成其他的業(yè)務(wù)也是可以的,只需要知道 studentID 是一個(gè)標(biāo)識(shí)列,確定有多少行。 name 是附帶的,有沒(méi)有都行,因?yàn)橛锌赡苤孛?,所以不能用name做標(biāo)識(shí),要用學(xué)號(hào)。
subject 是負(fù)責(zé)確定要增加多少列的,值相同的放到一列,不同的另起一列。
mark 是每一行的分?jǐn)?shù),和 subject 是key value的關(guān)系,subject 是key, Mark是value,只不過(guò)這個(gè)變成了上下關(guān)系。subject在表頭,Mark在body里面。
自我感覺(jué)注釋寫(xiě)的還算可以的。如果有看不明白的,歡迎討論。
最后效果圖一張
總結(jié)
以上所述是小編給大家介紹的vue實(shí)現(xiàn)行列轉(zhuǎn)換的一種方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
解決前后端分離 vue+springboot 跨域 session+cookie失效問(wèn)題
這篇文章主要介紹了前后端分離 vue+springboot 跨域 session+cookie失效問(wèn)題的解決方法,解決過(guò)程也很簡(jiǎn)單 ,需要的朋友可以參考下2019-05-05Vue?UI創(chuàng)建項(xiàng)目詳細(xì)步驟
本文主要介紹了Vue?UI創(chuàng)建項(xiàng)目詳細(xì)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01vue指令之表單控件綁定v-model v-model與v-bind結(jié)合使用
這篇文章主要介紹了vue指令之表單控件綁定v-model v-model與v-bind結(jié)合使用,需要的朋友可以參考下2019-04-04vue3中關(guān)于路由hash與History的設(shè)置
這篇文章主要介紹了vue3中關(guān)于路由hash與History的設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08axios發(fā)送post請(qǐng)求springMVC接收不到參數(shù)的解決方法
下面小編就為大家分享一篇axios發(fā)送post請(qǐng)求springMVC接收不到參數(shù)的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03使用vuex較為優(yōu)雅的實(shí)現(xiàn)一個(gè)購(gòu)物車功能的示例代碼
這篇文章主要介紹了使用vuex較為優(yōu)雅的實(shí)現(xiàn)一個(gè)購(gòu)物車功能的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12vue返回上一頁(yè)面時(shí)回到原先滾動(dòng)的位置的方法
這篇文章主要介紹了vue返回上一頁(yè)面時(shí)回到原先滾動(dòng)的位置的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12vue的路由守衛(wèi)和keep-alive后生命周期詳解
這篇文章主要為大家詳細(xì)介紹了vue路由守衛(wèi)和keep-alive,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03