手摸手,帶你用vue擼後台 系列三
完整項目地址:vue-element-admin
系類文章一:手摸手,帶你用vue擼後台 系列一(基礎篇)
系類文章二:手摸手,帶你用vue擼後台 系列二(登錄許可權篇)
前言
在前面兩篇文章中已經把基礎工作環境構建完成,也已經把後台核心的登錄和許可權完成了,現在手摸手,一起進入實操。
Element
去年十月份開始用vue做管理後台的時候毫不猶豫的就選擇了Elemen,那時候vue2 剛發沒多久,市面上也沒有很多其它的vue2的ui框架。雖然Element也有很多的不足,前期的bug也不少,但我還是選擇了它,說一下我選擇Element的原因吧:
有大廠背書 : 雖然核心開發只有三個人,但至少不用擔心哪天就不維護,帶著小姨子跑路了。
持續迭代 : Element發版至今release了四十多個版本,之前平均都是一周一個小版本更新(是不是不小心暴露了它bug多的問題/(ㄒoㄒ)/~~)
生態圈優異,社區活躍 :其 contributors已經有160多人(前期我有饒有興緻的貢獻過幾個pr,參與過七八十個issue),社區里也有很多基於Element 的拓展組件,也有很多相關的qq討論群或者gitter。
社區的認可:目前Element已經是vue相關最多star的開源項目了,體現出了社區對其的認可。
說了這麼多優點,作為一個資深Element用戶還是有些要抱怨的~和react老大哥Ant Design相比還是有一定的差距的,不管是組件的豐富性,參數的可配性還是文檔的完整性,亦或是UI的交互和美觀度。不過 ant 也是經過了近9k次commit的不斷打磨,才有了今天。我也相信 Element也會越來越好的。
這裡還有一些其它的框架(只討論pc端的框架)大家可以自行選擇:
ivew一國人個人寫的框架,美觀度和交互性都不錯,有種介於Element和Ant之間的感覺,之前和element團隊小小的撕了一下,有興趣的自己去圍觀吧,框架還是很不做的,一個人能做出這樣,也是很不容易的。作者公開信件
vue-admin也是一個不錯的選擇,代碼寫的和不錯,官方也出了一個admin的架子,也很值得借鑒
vue-material一個material design vue框架庫
vuetify又是一個material design vue框架庫
Keen-UI又又是一個material design vue框架庫
CoreUI-Free-Bootstrap-Admin-Template和以前的Bootstrap一樣,搭好了一個完整的架子,大家可以進行二次拓展,它有vue,react,angular多個版本
簡單列舉了一些主流的框架,不得不感慨現在vue的生態圈真是太繁榮了,上述框架樓主並沒有深入使用過,不好發表太多建議,大家自行甄別適合自己業務的框架吧。
這裡開始我們會開始介紹一些結合Element的開發經驗。
基於Element的動態換膚
有些產品就是這麼殘忍,能完成需求就不錯了,還要讓我們做動態換膚。Element官網上也提供了自定義主題的方案
同時也提供了一個在線自定義主題的demo
是不是很酷,作者也說明了實現的方案地址,大概思路:
先把默認主題文件中涉及到顏色的 CSS 值替換成關鍵詞
根據用戶選擇的主題色生成一系列對應的顏色值
把關鍵詞再換回剛剛生成的相應的顏色值
直接在頁面上加 style 標籤,把生成的樣式填進去
我看完覺得真的還是有點複雜的。有沒有簡單的方案呢?
讓我們思考一下,讓我們自己寫動態換膚該怎麼寫呢?最常見的方法就是寫兩套主題,一套叫day theme ,一套叫night theme,night theme主題 都在一個.night-theme的命名空間下,我們動態的在body上add .night-theme ; remove .night-theme。這就是最簡單的動態換膚。所以我們也能不能順著這個思路,基於Element實現動態換膚呢?
首先我們下載官方通過的Theme generator,一個專門用來生成Element主題的工具。按照文檔,我們生成了需要的主題。
之後就是我們要做的事情了,將這個主題的每個元素外面包裹一個class 來做命名空間。
我們這裡用到了gulp-css-wrap這個神器,輕輕鬆鬆就完成了我們想要的結果
這樣就得到了一個以.custom-theme為命名空間的自定義主題了,之後我們在項目中引入主題
//main.js import assets/custom-theme/index.css
我們在換膚的地方 一直toggle body 的 class就可以了。我們就簡單實現了動態換膚效果。
GIF/245K
不過這種模式實現換膚也是有一個弊端的,它等於把這兩個主題都打包在了項目里,如果你的項目主題需要七八種,這種模式就不適合了。我們就需要動態的載入css,下面就是最簡單的動態添加css的例子,當然你可以封裝一下,增加成功或者失敗回調,判斷是否載入過改資源等等就不展開了。
var head = document.getElementsByTagName( HEAD ).item(0); var style = document.createElement( link ); style.href = style.css ; style.rel = stylesheet ; style.type = text/css ; head.appendChild(style);側邊欄
這裡又有談一下導航欄的問題,我項目里的側邊欄是根據 router.js 配置的路由並且根據許可權動態生成的,這樣就省去了寫一遍路由還要再手動寫側邊欄這種麻煩事,但也遇到了一個問題,路由可能會有多層嵌套,很多人反饋自己的側邊欄會有三級,甚至還有五級的。所以重構了一下側邊欄,使用了遞歸組件,這樣不管你多少級,都能愉快的顯示了。代碼
側邊欄高亮問題:很多人在群里問為什麼自己的側邊欄不能跟著自己的路由高亮,其實很簡單,element-ui官方已經給了default-active所以我們只要
:default-active="$route.path"
將default-active一直指向當前路由就可以了,就是這麼簡單。
點擊側邊欄 刷新當前路由
在用spa這種開發模式的之前,用戶每次點擊側邊欄都會重新請求這個頁面,用戶漸漸養成了點擊側邊欄當前路由來刷新view的習慣。但現在spa就不一樣了,用戶點擊當前高亮的路由並不會刷新view,因為vue-router會攔截你的路由,它判斷你的url並沒有任何變化,所以它不會觸發任何鉤子或者是view的變化。issue地址,社區也對該問題展開了激烈討論。
尤大本來也說要增加一個方法來強刷view,但後來他又改變了心意/(ㄒoㄒ)/~~。但需要就擺在這裡,我們該怎麼辦呢?他說了不改變current URL 就不會觸發任何東西,那我可不可以強行觸發東西你?上有政策, 下有對策我們變著花來hack。方法也很簡單,通過不斷改變url的query來觸發view的變化。我們監聽側邊欄每個link 的 click事件,每次點擊都給router push 一個不一樣的query 來確保會重新刷新view。
clickLink(path) { this.$router.push({ path, query: { t: +new Date() //保證每次點擊路由的query項都是不一樣的,確保會重新刷新view } }) }
但這也有一個弊端就是 url 後面有一個很難看的 query 後綴如 ,但我司用戶們表示能接受。。。只能暫時這樣hack了,不知道大家有沒有更好的方法,學習學習。
keep-aliveTable
經過好幾個版本的迭代,Element 的table組件已經能滿足大部分業務需求了。不過rowSpan colSpan表格行/列合并現在並不是支持。官方對此功能的更新情況可以關注這個issue。
這裡我著重講一下table表格幾個常用的業務形態。
Table 拖拽排序
GIF/900K
這裡主要是基於Sortable
import Sortable from sortablejs let el = document.querySelectorAll( .el-table__body-wrapper > table > tbody )[0] let sortable = Sortable.create(el)
在table mounted之後申明 table的每行tr就可以隨意拖拽了,麻煩的目前我們的排序都是基於dom的,我們的數據層list並沒有隨之改變。所以我們就要手動的來管理我們的列表。
this.sortable = Sortable.create(el, { onEnd: evt => { //監聽end事件 手動維護列表 const tempIndex = this.newList.splice(evt.oldIndex, 1)[0]; this.newList.splice(evt.newIndex, 0, tempIndex); } });
這樣我們就簡單的完成了 table 拖拽排序。這裡如果不是基於 dom 的排序推薦使用Vue.Draggable。完整代碼
Table 內聯編輯
table內聯編輯也是一個常見的需求。
其實也很簡單,當我們拿到 list 數據之後先洗一下數據,每一條數據裡面插入一個edit[ true or false ]判斷符,來表示當前行是否處於編輯狀態。之後就是通過v-show動態切換不同的相應view就可以了。完整代碼
{{ scope.row.title }} 編輯 完成 Table 常見坑
通過dialog來編輯,新建,刪除table的元素這種業務場景相對於前面說的兩種更加的常見。而且也有不少的小坑。
首先我們要明確一個點 vue 是一個MVVM框架,我們傳統寫代碼是命令式編程,拿到table這個dom之後就是命令式對dom增刪改。而我們現在用聲明式編程,只用關注data的變化就好了,所以我們這裡的增刪改都是基於list這個數組來的。這裡我們還要明確一點vue 列表渲染注意事項
由於 JavaScript 的限制, Vue 不能檢測以下變動的數組:
* 當你利用索引直接設置一個項時,例如: vm.items[indexOfItem] = newValue
所以我們想改變table中第一條數據的值,通過 這樣是不會生效的。
解決方案: // Array.prototype.splice` example1.items.splice(indexOfItem, 1, newValue)
所以我們可以通過
//添加數據 this.list.unshift(this.temp); //刪除數據 const index = this.list.indexOf(row); //找到要刪除數據在list中的位置 this.list.splice(index, 1); //通過splice 刪除數據 //修改數據 const index = this.list.indexOf(row); //找到修改的數據在list中的位置 this.list.splice(index, 1,this.updatedData); //通過splice 替換數據 觸發視圖更新
這樣我們就完成了對table的增刪改操作,列表view也自動響應發生了變化。這裡在修改數據的時候還有一個小坑需要主要。
當我們拿到需要修改行的數據時候不能直接將它直接賦值給dialog,不然會發生下面的問題。
GIF/679K
如上圖所示,我們在dialog裡面改變狀態的時候,遮罩下面的table裡面該行的狀態也在那裡跟著一隻變化著。原因想必大家都猜到了。賦值的數據是一個objec引用類型共享一個內存區域的。所以我們就不能直接連等複製,需要重新指向一個新的引用,方案如下:
//賦值對象是一個obj this.objData=Object.assign({}, row) //這樣就不會共用同一個對象 //數組我們也有一個巧妙的防範 newArray = oldArray.slice(); //slice會clone返回一個新數組Tabs
tab在後台項目中也比較常用的。假設我們有四個tab選項,每個tab都會向後端請求數據,但我們希望一開始只會請求當前的tab數據,而且tab來回切換的時候不會重複請求,只會實例化一次。首先我們想到的就是用 這樣的確能做到一開始不會掛載後面的tab,但有一個問題,每次點擊這個tab組件都會重新掛載一次,這是我們不想看到的,這時候我們就可以用到 了。
keep-alive 包裹動態組件時,會緩存不活動的組件實例,而不是銷毀它們。 它是一個抽象組件:它自身不會渲染一個 DOM 元素,也不會出現在父組件鏈中。
所以我們就可以這樣寫tabs了
Select 選擇器
Select 選擇器直接使用沒有什麼太多問題,但很多時候我們需要通過Select來回顯一些數據,當我們 select 綁定一個obj value回顯就會很蛋疼了,它要求必須保持同一個引用issue。這就意味著,我們回顯數據的時候想先要找到該數據在arr中的位置,再回塞:demo。這還不是在遠程搜索的情況下,如果是遠程搜索的情況還要當疼。
這裡推薦一下vue-multiselect它能完美的解決前面Element select的問題。目前也是vue component 中比較好用的一個,ui也非常的好看,建議大家可以嘗試性用一下,真的非常的不錯。
Upload 上傳
Upload本身沒什麼好說的,文檔寫的蠻清楚了。這裡主要說一下怎麼將Upload組件和七牛直傳結合在一起。
這裡我們選擇api直傳的方式,就是我們首先要通過後端(go,node,php都可以)文檔生成七牛上傳必要的token(上傳憑證)和key(資源的最終名稱)。
所以現在只要想辦法講token和key塞進post請求裡面就可以了,好在官方也提供了這個方法。
。但怎麼才能先非同步的拿到token再將它塞入請求里呢?
這時候我們又發現了before-upload 這個鉤子還支持promise簡直合我們的心意。
但我們寫著寫著怎樣才能動態的改變之前的dataObj呢?通過看源碼發現我們可以_self._data這樣子拿到我們想要的數據。線上代碼
將文件拖到此處,或點擊上
jsx
在使用Element的時候,官方提供了很多可以自己寫render function的地方,但由於Element內部都是用jsx 寫render function的,所以demo也都是jsx,但很多人自己項目中其實是沒有安裝的,導致報錯。但說真的用createElement裸寫render 函數還是有些蛋疼。我們要用jsx,首先要安裝babel-plugin-transform-vue-jsx安裝方法如下:
npm install babel-plugin-syntax-jsx babel-plugin-transform-vue-jsx babel-helper-vue-jsx-merge-props babel-preset-es2015 --save-dev
.babelrc:文件
{ "presets": ["es2015"], "plugins": ["transform-vue-jsx"] }
這樣我們就可以愉快的使用 jsx 寫render function了。
element 常見問題
click事件不觸發問題:一直有人在群里問 怎麼不觸發click事件,雖然element文檔還有完善的空間但這種問題大家還真要自己好好認真看一下官方的FAQ了。
官方說明了所有的原生事件必須添加 .native 修飾符。
修改element樣式問題:用ui組件總免不了需要對它做一些個性化定製的需求,所以我們就要覆蓋element的一些樣式。
首先我們要了解一下vue scoped是什麼,很多人非常喜歡用scoped,媽媽再也不用擔心樣式衝突問題了,其實scoped也沒有很神秘的,它就是基於PostCss的,加了一個作用局的概念。
//編譯前 .example { color: red; } //編譯後 .example[_v-f3f3eg9] { color: red; }
它和我們傳統的命名空間的方法避免css衝突沒有什麼本質性的區別。
現在我們來說說怎麼覆蓋element-ui樣式。由於element-ui的樣式我們是在全局引入的,所以你想在某個view裡面覆蓋它的樣式就不能加scoped,但你又想只覆蓋這個頁面的element樣式,你就可在它的父級加一個class,以用命名空間來解決問題。
.aritle-page{ //你的命名空間 .el-tag { //element-ui 元素 margin-right: 0px; } }
建議向樓主一樣專門建一個scss文件里專門自定義element-ui的各種樣式。線上代碼
其它關於element相關的東西真的沒有什麼好說的了,人家文檔和源碼就放在那裡,有問題就去看文檔,再去issue里找找,再去看看源碼,大部分問題都能解決了。給一個訣竅其實大部分詭異的問題都可以通過加一個key或者
Vue.nextTick來解決。。
富文本
管理後台富文本也是一個非常重要的功能,樓主在這裡也踩了不少的坑。樓主在項目里最終選擇了tinymce
這裡在簡述一下推薦使用tinymce的原因:tinymce是一家老牌做富文本的公司(這裡也推薦ckeditor,也是一家一直做富文本的公司,也不錯),它的產品經受了市場的認可,不管是文檔還是配置的自由度都很好。在使用富文本的時候有一點也很關鍵就是複製格式化,之前在用一款韓國人做的富文本summernote被它的格式化坑的死去活來,但tinymce的去格式化相當的好,它還有一個增值項目就是powerpaste,那是無比的強大,支持從word裡面複製各種東西,都不會有問題。富文本還有一點也很關鍵,就是拓展性。樓主用tinymce寫了好幾個插件,學習成本和容易度都不錯,很方便拓展。最後一點就是文檔很完善,基本你想得到的配置項,它都有。tinymce也支持按需載入,你可以通過它官方的build頁定製自己需要的plugins。
我再來分析一下市面上其它的一些富文本:
summernote先來說一個我絕對不推薦的富文本。這是一個韓國人開源的富文本(當然不推薦的理由不是因為這個^_^),它對很多富文本業界公認的默認行為理解是反起到而行的,而且只用了一個dialog的功能,引入了boostrap,一堆人抗議就是不改。格式化也是懶得一批。。反正不要用!不要用!不要用!
ckeditorckeditor也是一家老牌做富文本的公司,樓主舊版後台用的就是這個,今年也出了4.0版本,ui也變美觀了不少,相當的不錯,而且它號稱是插件最豐富的富文本了。推薦大家也可以試用一下。
quill也是一個非常火的富文本,長相很不錯。基於它寫插件也很簡單,api設計也很簡單。樓主不選擇它的原因是它對圖片的各種操作不友善,而且很難改。如果對圖片沒什麼操作的用戶,推薦使用。
medium-editor大名鼎鼎的medium的富文本(非官方出品),但完成度還是不很不錯,拓展性也不錯。不過我覺得大部分用戶還是會不習慣medium這種寫作方式的。
Squire一個比較輕量的富文本,壓縮完才11.5kb,相對於其它的富文本來說是非常的小了,推薦功能不複雜的建議使用。
wangEditor一個國人寫的富文本,用過感覺還是不錯的。不過畢竟是個人的,不像專門公司做富文本的,配置型和豐富性不足。前端幾大禁忌就有富文本為什麼都說富文本編輯器是天坑?,不過個人能做成這樣子很不容易了。
百度UEditor沒有深入使用過,只在一個angular1X的項目簡單用過,不過說著的ui真的不好看,不符合當今審美了,官方也已經很久沒跟新過了。
樓主列舉了很多富文本但並沒有列舉任何vue相關的富文本,主要是因為富文本真的比想像中複雜,在前面的文章里也說過了,其實用vue封裝組件很方便的,沒必要去用人家封裝的東西什麼vue-quill vue-editor這種都只是簡單包了一層,沒什麼難度的。還不如自己來封裝,靈活性可控性更強一點。還有一點基於vue真沒什麼好的富文本,不像 react 有facebook 出的draft-js,ory出的editor,這種大廠出的產品。
Markdown
markdown 我們這裡選用了simplemde-markdown-editor,簡單的用vue封裝了一下地址,如果需求方能接受 markdown 就一定要用 markdown,坑真心會比富文本少很多。這裡我們用markdown做了編輯器,還需要一個能解析的的東西。可以你傳給後端讓後端幫你轉化,也可以前端自己來,這裡推薦一個轉化庫showdown。使用方法:
import( showdown ).then(showdown => { //用了 Dynamic import const converter = new showdown.Converter();//初始化 this.html = converter.makeHtml(this.content)//轉化 })
用法也很簡單兩行代碼就完成了markdown to html,當然它還有很多個性畫的配置,大家有需求自行研究吧。
GIF/155K
導出excel
這裡先明確一點,如果你的業務需求對導出文件的格式沒有什麼要求,不建議導出成xlsx格式的,直接導出成csv的就好了,真的會簡單很多。創建一個a標籤,寫上 頭,再把數據塞進去, 一下就好了,詳情就不展開了,大家可以借鑒這個stackoverflow回答。
我們重點說一下轉xlsx,我們這裡用到了js-xlsx,一個功能很強大excel處理庫,只是下載各種格式excel,還支持讀取excel,但上手難度也非常大,相當的複雜,其中涉及不少二進位相關的東西。不過好在官方給了我們一個demo例子,我們寫不來還抄不來么,於是我們就借鑒官方的例子來改造了一下,具體原理就不詳細說了,真的很複雜。。。
重點是我們怎麼使用!首先我們封裝一個Export2Excel.js,
它又依賴三個庫
require( script-loader!file-saver ); //保存文件用 require( script-loader!vendor/Blob ); //轉二進位用 require( script-loader!xlsx/dist/xlsx.core.min ); //xlsx核心 由於這幾個文件不支持import引入,所以我們需要`script-loader`來將他們掛載到全局環境下。
它暴露了兩個介面 和 ,我們常用 因為更加的可控一點,我們可以自由的洗數據。
handleDownload() { require.ensure([], () => { // 用 webpack Code Splitting xlsl還是很大的 const { export_json_to_excel } = require( vendor/Export2Excel ); const tHeader = [ 序號", 文章標題 , 作者 , 閱讀數", 發布時間"]; // excel 表格頭 const filterVal = [ id , title , author , pageviews , display_time ]; const list = this.list; const data = this.formatJson(filterVal, list); // 自行洗數據 按序排序的一個array數組 export_json_to_excel(tHeader, data, 列表excel ); }) }, formatJson(filterVal, jsonData) { return jsonData.map(v => filterVal.map(j => v[j])) }ECharts
管理後台圖表也是常見得需求。這裡圖表就只推薦ECharts,功能齊全,社區demo也豐富gallery。我還是那個觀點,大部分插件建議大家還是自己用vue來包裝就好了,真的很簡單。ECharts支持webpack引入,圖省事可以將ECharts整個引入 不過ECharts還是不小的,我們大部分情況只是用到很少一部分功能,我平時習慣於按需引入的。
// 引入 ECharts 主模塊 var echarts = require( echarts/lib/echarts ); // 引入柱狀圖 require( echarts/lib/chart/bar ); // 引入提示框和標題組件 require( echarts/lib/component/tooltip ); require( echarts/lib/component/title );
接下來我們就要在vue中聲明初始化ECharts了。因為ECharts初始化必須綁定dom,所以我們只能在vue的mounted生命周期里初始化。
mounted() { this.initCharts(); }, methods: { initBar() { this.chart = echarts.init(this.$el); this.setOptions(); }, setOptions() { this.chart.setOption({ title: { text: ECharts 入門示例 }, tooltip: {}, xAxis: { data: ["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"] }, yAxis: {}, series: [{ name: 銷量", type: bar , data: [5, 20, 36, 10, 10, 20] }] }) } }
就這樣簡單,ECharts就配置完成了,這時候你想說我的data是遠程獲取的,或者說我動態改變ECharts的配置該怎麼辦呢?我們可以通過watch來觸發setOptions方法
//第一種 watch options變化 利用vue的深度 watcher,options一有變化就重新setOption watch: { options: { handler(options) { this.chart.setOption(this.options) }, deep: true }, } //第二種 只watch 數據的變化 只有數據變化時觸發ECharts watch: { seriesData(val) { this.setOptions() } }
其實都差不多,還是要結合自己業務來封裝。後面就和平時使用ECharts沒有什麼區別了。題外話ECharts的可配置項真心多,大家使用的時候可能要花一點時間了解它的api的。知乎有個問題:百度還有什麼比較良心的產品?答案:ECharts,可見ECharts的強大與好用。
相同component 不同參數
創建與編輯
其實後台創建與編輯功能是最常見的了,它區別去前台項目多了改的需求,但大部分創建頁面與編輯頁面欄位和ui幾乎是一樣的,所以我們準備公用一個component來對應不同的頁面。有兩種常見的方法,來區別創建與編輯。
通過路由path的方式
這種方式最簡單暴力,我自己的項目中使用這種方式,通過約定路徑中出現 edit 就判斷為編輯模式。比較省力和方便,不過這是要在大家寫路徑的時候都按照規範來寫的前提下。
通過meta來區分
比較推薦這種方式來區分。
computed: { isEdit() { return this.$route.meta.isEdit // 根據meta判斷 // return this.$route.path.indexOf( edit ) !== -1 // 根據路由判斷 } }, created() { if (this.isEdit) { this.fetchData(); } },
就這樣簡單的實現了多路由復用了一個component,其實不只是創建和編輯可以這樣用,如兩個列表的一模一樣,只是一個是內部文章另一個是調取外部文章都能復用組件,通過meta的方式來判斷調取不同的介面。
占坑
常規占坑,這裡是手摸手,帶你用vue擼後台系類
之後計劃項目應會加上i18n,並完善一下代碼和文檔。
下一篇文章可能會寫關於如何用 electron 包裝現有項目,快速實現一個跨平台的終端後台。


※筆記本行業要靠遊戲改變嗎?
※營銷史上最環保的一次logo變更,就這樣有愛的完成了
※promise的使用
※WidgetLayout:一組繼承於 ViewGroup 的自定義容器集合
※關於編程一些雜亂的想法
TAG:推酷 |
※手把手教你打造Vue小型項目
※vue腳手架搭建
※為什麼我不推薦你使用vue-cli創建腳手架?
※你真的會Vue嗎?送你一份Vue進階指南
※手把手教Vue-路由「Vue-rouer」
※超詳細!動手搭建一個Vuepress站點及開啟PWA與自動部署
※我為什麼要立刻放棄 React 而使用 Vue?
※vue腳手架安裝教程+基本操作
※三年 React 開發經驗的我,遷移到 Vue 的心路歷程
※教你使用Vue.js的DevTools來調試你的vue項目
※vue動態添加路由addRoutes之不能將動態路由存入緩存
※vue.js打包之後遇到問題
※Vue 實現前進刷新,後退不刷新的效果
※不吹不黑丨用Vue和React構建相同應用程序,區別在哪?
※打通前後端構建一個Vue+Express的開發環境
※不只端午節,每天都有你 Revue Thommen
※《少女歌劇Revue Starlight》手游曝光
※vue Router在新標籤打開頁面的實踐
※Vue + Django?—?使用兩種前端框架的優勢
※vue-cli 腳手架中 webpack 配置基礎文件詳解