欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue3+Vite實現(xiàn)動態(tài)路由的詳細實例代碼

 更新時間:2022年08月25日 15:48:15   作者:祥武的哥哥  
我們在開發(fā)大型系統(tǒng)的時候一般都需要動態(tài)添加路由,下面這篇文章主要給大家介紹了關于Vue3+Vite實現(xiàn)動態(tài)路由的相關資料,文中通過圖文以及實例代碼介紹的非常詳細,需要的朋友可以參考下

項目基本目錄

1.首先定義初始默認的路由routes(router.js文件),vue文件使用import引入可以按需加載

import {
    createRouter,
    createWebHashHistory
} from "vue-router";
 
import store from '../store/index.js'
 
const routes = [{
        path: "/login",
        component: () => import("../view/Login/index.vue"),
 
        children: [],
        meta: {
            title: '登錄頁',
            hideMenu: true, //加入hideMenu屬性,不展示在側邊欄
        },
        name: "Login",
    },
    {
        path: "/",
        component: () => import("../view/Home/index.vue"),
        meta: {
            keepalive: true,
            title: "主頁",
        },
        name: 'Home',
        // hideMenu: true,//不展示在側邊欄
        children: [],
        redirect: '/index'
    },
]

2.在store的login.js模塊寫入調(diào)用后端數(shù)據(jù)的函數(shù)(寫在vuex的action對象中,方便全局異步調(diào)用)

Vuex 允許我們將 store 分割成模塊(module),比如登錄模塊,項目各個業(yè)務不相關的模塊。每個模塊擁有自己的 state、mutation、action、getter、甚至是嵌套子模塊(具體可以看主頁另一篇博客)

3.執(zhí)行addRoutes函數(shù)獲取動態(tài)路由 (在router.js文件,點擊登錄成功后,在全局路由守衛(wèi)去判斷是否登錄成功,再調(diào)用addRoutes函數(shù)) 

(1)全局路由守衛(wèi)邏輯具體可看注釋,好處是進入項目之后,刷新頁面路由守衛(wèi)會攔截跳轉(zhuǎn),可以重新執(zhí)行addRoutes()獲取路由,先獲取動態(tài)路由,再執(zhí)行跳轉(zhuǎn),不然頁面會報本地路由找不到(一個小坑)

(代碼如下)

router.beforeEach(async (to, from, next) => { //路由守衛(wèi)
    if (store.state.login.token) { //存在token
        if (to.path == '/login') { //存在token,如果想跳轉(zhuǎn)到登錄頁,默認有token跳轉(zhuǎn)進項目首頁
            next({
                path: '/'
            })
        } else { 
                //如果存在token,跳轉(zhuǎn)進項目頁面,則判斷當前后端返回的路由有無長度
                //或者有無即將跳轉(zhuǎn)路由的name
            if (store.getters['login/getRoutes'].length || to.name != null) {
                next() //有的話直接跳轉(zhuǎn)
            } else { //不滿足條件的話,重新請求后端動態(tài)路由數(shù)據(jù)
                await addRoutes(); //addRoutes()必須加入await!!!!等待邏輯執(zhí)行完畢獲取路由
                // 如果 addRoute 未完成,路由守衛(wèi)會一層一層的執(zhí)行執(zhí)行,不加next()可能導致卡死!
                //直到 addRoute 完成,找到對應的路由
                next({
                    ...to,
                    replace: true
                })
            }
        }
    } else {
        if (to.path == '/login') {
            next()
        } else {
            next('/login')
        }
    }
})

后端返回的格式

(2)(重點在這,前面的步驟都可以不是重點)Vite使用import.meta.glob動態(tài)導入view文件夾所有前端頁面,并調(diào)用addRoutes()函數(shù)執(zhí)行獲取動態(tài)路由數(shù)據(jù)并做處理(代碼如下),主要作用是替換掉后端返回的component格式,再addRoute進路由表(看不懂的可以看代碼注釋或者可以搬進自己的項目打印看看每一步獲取的數(shù)據(jù))

let asyncRoutes = [] //定義數(shù)組接收后端返回的路由
 
const routeAllPathToCompMap =import.meta.glob(`../view/**/*.vue`);
//**為通配符,vite不支持require導入方式,故用import.meta.glob(vite動態(tài)導入)
/*import.meta.glob
 * 該方法匹配到的文件默認是懶加載,通過動態(tài)導入實現(xiàn),構建時會分離獨立的 chunk,是異步導入,返回的是 Promise
 * /*import.meta.globEager
 * 該方法是直接導入所有模塊,并且是同步導入,返回結果直接通過 for...in循環(huán)就可以操作
 */
async function addRoutes() {
    await store.dispatch('login/getNewRoutes').then((res) => { //獲取后端返回的動態(tài)路由
        if (res.data && res.data.length) {
            // let homeRouteChildren = [];
            asyncRoutes = res.data;
            /*
             * 1。拿到處理完畢home的children,最終替換掉原來的children,給菜單渲染提供支持
             * 2.通過遞歸,調(diào)用router.addRoute,把每一項route插到對應的父route下
             */
            //服務端配置了路由,但前端還沒添加對應文件的路由列表,內(nèi)容是路由的component值(服務端的)
            // const unForList = ['']
            const homeChildren = routes[1].children;
            const dfs = (parentRouteName = 'Home', asyncRoutes = [], originRouteChildren = []) => {
                if (!Array.isArray(asyncRoutes)) return [];
                asyncRoutes.forEach(route => {
                    // if (unForList.includes(route.component)) return;
/**后端返回來的路由component是字符串,如component: "view/Index/index.vue",
 * 前端需要把component: "view/Index/index.vue" 轉(zhuǎn)化為組件對象
 * component:() => import("/src/view/Index/index.vue")
**/
                    route.component = routeAllPathToCompMap[`../${route.component}`];
                    // route.component = () => import(`../${route.component}`);
                    const routeChildren = route.children;
 
                    router.addRoute(parentRouteName, route);
 
                    route.children = dfs(route.name, routeChildren)
 
                    originRouteChildren.push(route)
                })
                return originRouteChildren
            }
            // homeRouteChildren = dfs(asyncRoutes)
            dfs('Home', asyncRoutes, homeChildren)
        }
    });
}

最終轉(zhuǎn)化完成,路由數(shù)據(jù)格式如下 

動態(tài)路由到此完成

總結

到此這篇關于Vue3+Vite實現(xiàn)動態(tài)路由的文章就介紹到這了,更多相關Vue3+Vite動態(tài)路由內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一文詳解Vue3中的自定義指令的使用

    一文詳解Vue3中的自定義指令的使用

    自定義指令是?Vue.js?中一個強大的特性,它允許您擴展?Vue?的模板語法,本文將詳細介紹?Vue?3?中的自定義指令,包括如何創(chuàng)建它們以及如何將它們應用于您的應用程序,需要的可以參考下
    2023-11-11
  • 在Vue 中使用Typescript的示例代碼

    在Vue 中使用Typescript的示例代碼

    這篇文章主要介紹了在Vue 中使用Typescript的示例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • vue倉庫的使用方式

    vue倉庫的使用方式

    這篇文章主要介紹了vue倉庫的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • 淺談vuepress 踩坑記

    淺談vuepress 踩坑記

    本篇文章主要介紹了淺談vuepress 踩坑記,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • vue前端常用的工具類總結

    vue前端常用的工具類總結

    這篇文章主要為大家詳細介紹了6個vue前端常用的工具類,可直接復用,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • vant 解決tab切換插件標題樣式自定義的問題

    vant 解決tab切換插件標題樣式自定義的問題

    這篇文章主要介紹了vant 解決tab切換插件標題樣式自定義的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Vue.js 2.0學習教程之從基礎到組件詳解

    Vue.js 2.0學習教程之從基礎到組件詳解

    這篇文章主要介紹了Vue.js 2.0從基礎到組件的相關資料,文中介紹的非常詳細,對大家學習或者使用vue.js具有一定的參考價值,需要的朋友可以參考學習,下面來一起看看吧。
    2017-04-04
  • vue+echarts定時重新繪制以達到刷新的動效問題

    vue+echarts定時重新繪制以達到刷新的動效問題

    這篇文章主要介紹了vue+echarts定時重新繪制以達到刷新的動效問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 你準備好迎接vue3.0了嗎

    你準備好迎接vue3.0了嗎

    這篇文章主要介紹了你準備好迎接vue3.0了嗎,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • vue中使用vue-pdf組件實現(xiàn)文件預覽及相應報錯解決

    vue中使用vue-pdf組件實現(xiàn)文件預覽及相應報錯解決

    在需求中,經(jīng)常遇見pdf的在線預覽效果,很多pdf插件不支持vue3,或者是沒有集成翻頁放大縮小功能,比如vue-pdf,下面這篇文章主要給大家介紹了關于vue中使用vue-pdf組件實現(xiàn)文件預覽及相應報錯解決的相關資料,需要的朋友可以參考下
    2022-09-09

最新評論