您好,登錄后才能下訂單哦!
Vue中怎么實(shí)現(xiàn)自動化路由,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
為什么要自動化路由
路由自動化在于解決以下的問題:
每次新建頁面時的重復(fù)操作:在路由文件中添加對應(yīng)的路由對象。
路由與代碼耦合:路由依賴于路由對象的硬編碼,當(dāng)某一路由發(fā)生變動時,勢必需要修改對應(yīng)的路由對象。當(dāng)路由層級、路徑發(fā)生改變時,甚至可能面臨的是整個路由對象數(shù)組的重寫。
路由之間進(jìn)行跳轉(zhuǎn)時的硬編碼。
目的很簡單,在開發(fā)過程中,開發(fā)者僅需要做兩件事即可:
為這個路由命名
在對應(yīng)的目錄下創(chuàng)建 .vue
文件
開發(fā)過程中只需要做這兩步,無需再去關(guān)心路由對象如何編寫。
甚至可以忽略第一步,對于小型項(xiàng)目而言。
自動化路由規(guī)則
這些規(guī)則一部分是給開發(fā)者看,另一部分是給程序看的:
路由目錄需要指定
路由目錄下,每一層(一個文件夾即為一層) 必須 要有一個 Layout.vue
文件,用來渲染子路由。
路由目錄下的組件路徑即為其對應(yīng)的路由,比如指定了 src/views
文件夾,里面的 src/views/admin/users
對應(yīng)的路由即是: localhost/admin/users
。
路由目錄下不區(qū)分大小寫,統(tǒng)一轉(zhuǎn)換成小寫處理。
以上便是我們制定的自動化路由規(guī)則。
定義
先提取出三個概念:
自動化路由的提供者,它就是 對外 開放的接口,開發(fā)者只需要使用它就可以。
視圖,指的是一個視圖組件的相關(guān)信息,比如路徑、名稱等等。
路由,指的是解析視圖之后對應(yīng)的路由對象,用于生成 vue-router
的路由對象。
開始開發(fā)
由于代碼過長,這里將代碼上傳至 Github
, 有興趣的童鞋可以去看看。
這里只描述一下整體流程以及關(guān)鍵部分的代碼思路。
先通過 require.context
獲取到指定目錄下的所有 .vue
文件。
通過前綴以及排序操作,將其還原成目錄結(jié)構(gòu)。
通過還原的目錄結(jié)構(gòu),進(jìn)行解析。
將解析后的結(jié)構(gòu)轉(zhuǎn)換成路由對象。
其中最關(guān)鍵的地方便是通過 require.context
獲取到的文件列表還原成原來的樹形結(jié)構(gòu)。
還原成樹形結(jié)構(gòu)之后就可以對應(yīng)樹形結(jié)構(gòu)進(jìn)行路由對象的生成了。
首先將文件列表進(jìn)行排序,根據(jù)文件的深度進(jìn)行排序,深度淺的在前,深的在后。
_getViews(dir) { let views = []; let keys = dir.keys(); for (let index in keys) { let path = keys[index]; let component = dir(path); views.push(View.create(path, component.default || component)) } views = views.sort((x, y) => { return x.Deep > y.Deep ? 1 : -1; }); return views; }
根據(jù)排序后的列表對目錄結(jié)構(gòu)進(jìn)行還原:
/** * 解析views,生成對應(yīng)的目錄結(jié)構(gòu) * @private */ _generateDirectory() { for (let index in this._views) { let view = this._views[index]; this._directory.addView(view); } }
addView
方法:
addView(view) { if(this.isCurrentDirectoryView(view)) { this._views.push(view); } else if(this._isInSubDirectory(view)) { this._addInSubDirectory(view); } else { let newSubDirectory = this._createSubDirectory(view); newSubDirectory.addView(view); this._subDirectory.push(newSubDirectory); } }
對于目錄還原時有三種可能:
這個文件就是當(dāng)前目錄下的文件
這個文件是當(dāng)前目錄下已有子目錄的文件
這個文件是當(dāng)前目錄下子目錄的文件,且為首次出現(xiàn)
將目錄還原后,就可以根據(jù)目錄生成對應(yīng)的路由對象。并且在生成時可以做一些定制化的需求,比如開篇提出來的需求:
如果當(dāng)前文件是 Layout.vue
,即默認(rèn)為當(dāng)前路由的根路由
如果當(dāng)前文件是 Index.vue
, 即默認(rèn)為當(dāng)前層的空路由(根路由入口直接渲染)
使用方法,將 router.js
中的路由對象替換成自動生成的即可:
import Vue from 'vue' import Router from 'vue-router' import Generator from './routerGenerator/generator'; Vue.use(Router); let generator = new Generator(require.context('./views', true, /\.vue$/)); export default new Router({ routes: [generator.generate()] })
目錄結(jié)構(gòu)如下:
效果如下:
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。