最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺入深出Vue之自動化路由

 更新時(shí)間:2019年08月06日 08:25:39   作者:若羽。  
這篇文章主要介紹了淺入深出Vue之自動化路由,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在軟件開發(fā)的過程中,"自動化"這個(gè)詞出現(xiàn)的頻率是比較高的。 自動化測試 , 自動化數(shù)據(jù)映射 以及各式的代碼生成器。這些詞語的背后,也說明了在軟件開發(fā)的過程中,對于那些 重復(fù)千篇一律 的事情。人們總是想讓它自己完成,來解放我們的雙手。

“懶惰”是進(jìn)步的動力

為什么要自動化路由

路由自動化在于解決以下的問題:

  • 每次新建頁面時(shí)的重復(fù)操作:在路由文件中添加對應(yīng)的路由對象。
  • 路由與代碼耦合:路由依賴于路由對象的硬編碼,當(dāng)某一路由發(fā)生變動時(shí),勢必需要修改對應(yīng)的路由對象。當(dāng)路由層級、路徑發(fā)生改變時(shí),甚至可能面臨的是整個(gè)路由對象數(shù)組的重寫。
  • 路由之間進(jìn)行跳轉(zhuǎn)時(shí)的硬編碼。

目的很簡單,在開發(fā)過程中,開發(fā)者僅需要做兩件事即可:

  • 為這個(gè)路由命名
  • 在對應(yīng)的目錄下創(chuàng)建 .vue 文件

開發(fā)過程中只需要做這兩步,無需再去關(guān)心路由對象如何編寫。

甚至可以忽略第一步,對于小型項(xiàng)目而言。

自動化路由規(guī)則

這些規(guī)則一部分是給開發(fā)者看,另一部分是給程序看的:

  1. 路由目錄需要指定
  2. 路由目錄下,每一層(一個(gè)文件夾即為一層) 必須 要有一個(gè) Layout.vue 文件,用來渲染子路由。
  3. 路由目錄下的組件路徑即為其對應(yīng)的路由,比如指定了 src/views 文件夾,里面的 src/views/admin/users 對應(yīng)的路由即是: localhost/admin/users
  4. 路由目錄下不區(qū)分大小寫,統(tǒng)一轉(zhuǎn)換成小寫處理。

以上便是我們制定的自動化路由規(guī)則。

定義

先提取出三個(gè)概念:

自動化路由的提供者,它就是 對外 開放的接口,開發(fā)者只需要使用它就可以。

視圖,指的是一個(gè)視圖組件的相關(guān)信息,比如路徑、名稱等等。

路由,指的是解析視圖之后對應(yīng)的路由對象,用于生成 vue-router 的路由對象。

開始開發(fā)

由于代碼過長,這里將代碼上傳至 Github , 有興趣的童鞋可以去看看。

這里只描述一下整體流程以及關(guān)鍵部分的代碼思路。

  1. 先通過 require.context 獲取到指定目錄下的所有 .vue 文件。
  2. 通過前綴以及排序操作,將其還原成目錄結(jié)構(gòu)。
  3. 通過還原的目錄結(jié)構(gòu),進(jìn)行解析。
  4. 將解析后的結(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);
  }
}

對于目錄還原時(shí)有三種可能:

  • 這個(gè)文件就是當(dāng)前目錄下的文件
  • 這個(gè)文件是當(dāng)前目錄下已有子目錄的文件
  • 這個(gè)文件是當(dāng)前目錄下子目錄的文件,且為首次出現(xiàn)

將目錄還原后,就可以根據(jù)目錄生成對應(yīng)的路由對象。并且在生成時(shí)可以做一些定制化的需求,比如開篇提出來的需求:

  • 如果當(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)如下:

效果如下:

github地址: https://github.com/WhileKing/ea-router

npm地址: https://www.npmjs.com/package/ea-router

npm包安裝使用:

npm i ea-router

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue3+elementui-plus實(shí)現(xiàn)無限遞歸菜單示例代碼

    vue3+elementui-plus實(shí)現(xiàn)無限遞歸菜單示例代碼

    這篇文章主要介紹了vue3+elementui-plus實(shí)現(xiàn)無限遞歸菜單,當(dāng)一個(gè)組件的 key 值發(fā)生變化時(shí),Vue 會認(rèn)為這是一個(gè)新的組件實(shí)例,會強(qiáng)制重新創(chuàng)建和渲染這個(gè)組件,本文通過示例代碼詳細(xì)講解,需要的朋友可以參考下
    2024-04-04
  • Vuex的五大核心詳細(xì)講解

    Vuex的五大核心詳細(xì)講解

    這篇文章主要為大家介紹了vuex的五個(gè)核心概念和基本使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-09-09
  • vue項(xiàng)目登錄頁面實(shí)現(xiàn)記住用戶名和密碼的示例代碼

    vue項(xiàng)目登錄頁面實(shí)現(xiàn)記住用戶名和密碼的示例代碼

    本文主要介紹了vue項(xiàng)目登錄頁面實(shí)現(xiàn)記住用戶名和密碼的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 關(guān)于vue-i18n在單文件js中的使用

    關(guān)于vue-i18n在單文件js中的使用

    這篇文章主要介紹了關(guān)于vue-i18n在單文件js中的使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 關(guān)于Vue中this.$set的正確使用

    關(guān)于Vue中this.$set的正確使用

    我們在項(xiàng)目開發(fā)的過程中,經(jīng)常會遇到這種情況:為data中的某一個(gè)對象添加一個(gè)屬性,我們該如何解決這個(gè)問題呢,下面小編給大家?guī)砹薞ue中this.$set的正確使用,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • vue cli3 實(shí)現(xiàn)分環(huán)境打包的步驟

    vue cli3 實(shí)現(xiàn)分環(huán)境打包的步驟

    這篇文章主要介紹了vue cli3 實(shí)現(xiàn)分環(huán)境打包的步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • vue路由傳參-如何使用encodeURI加密參數(shù)

    vue路由傳參-如何使用encodeURI加密參數(shù)

    這篇文章主要介紹了vue路由傳參-如何使用encodeURI加密參數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • vue實(shí)現(xiàn)移動端適方案的完整步驟

    vue實(shí)現(xiàn)移動端適方案的完整步驟

    現(xiàn)在的手機(jī)五花八門,造就了移動端窗口分辨率繁多的局面,在不同分辨率的屏幕下保持與UI圖一致的效果,就成了讓前端不得不頭疼的問題,下面這篇文章主要給大家介紹了vue實(shí)現(xiàn)移動端適方案的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 淺入深出Vue之自動化路由

    淺入深出Vue之自動化路由

    這篇文章主要介紹了淺入深出Vue之自動化路由,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Vue3項(xiàng)目中引用TS語法的實(shí)例講解

    Vue3項(xiàng)目中引用TS語法的實(shí)例講解

    這篇文章主要介紹了Vue3項(xiàng)目中引用TS語法的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評論

德清县| 志丹县| 杨浦区| 新闻| 遵化市| 西丰县| 资中县| 北海市| 丰顺县| 德兴市| 前郭尔| 乐平市| 子长县| 渭源县| 武冈市| 泊头市| 松原市| 贵州省| 青龙| 武邑县| 武夷山市| 托克托县| 西华县| 大埔县| 伊宁县| 太湖县| 福州市| 阿拉善右旗| 清流县| 贵阳市| 马鞍山市| 嘉善县| 三原县| 贵溪市| 哈密市| 锡林浩特市| 普定县| 南京市| 新龙县| 宁城县| 龙口市|