关于vue3中动态路由的配置

1.目录结构

 

 

 2.分析


 

index中放置路由的基本配置

import { createRouter, createWebHashHistory } from 'vue-router'
import routes from './routes'
const router = createRouter({
    // hash模式
    history: createWebHashHistory(),
    routes
})
export default router

routes.js中放置配置的静态路由

如果在权限配置中路由全是通过接口得到,那可以不需要这个

如果部分路由放置在本地,然后根据不同角色权限手动添加一些路由,可以这样拆分

const routes = [
    {
        path: '/',
        name: 'Home',
        // component: Home
        component: () => import('../pages/Home/index.vue')
    }
]
export default routes

promission.js中放置对路由的处理逻辑

// 引入路由
import router from './index.js'
import routes from './routes.js'
// 引入第三方插件 进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
// 动态路由的配置
let getRouter;
router.beforeEach((to, from, next) => {
    NProgress.start()
  // 在具体的项目中还涉及到跳转登录、用户session信息等,需要处理更详细些,否则会有死循环
if (!getRouter) { // 没有路有,先拿到动态路由 getRouter = handleRoutes(routes) routerGo(to, next) NProgress.done() } else { next() NProgress.done() } }) router.afterEach(() => { NProgress.done() })

涉及到的方法:

1:handleRoutes

这里只是个例子,终究就是说:如果这个角色有权限,那么就向原路由中添加新的路由,该方法以原路由作为参数

function handleRoutes(menuList) {
    if (!menuList || menuList.length === 0) {
        return false
    }
    let whiteList = ['55555', '12']
    let userId = localStorage.getItem('wx')
    for (let i in whiteList) {
        if (whiteList[i] === userId) {
      // 按照自己项目逻辑做不同的处理 menuList.push({ path:
'/tem', name: 'Tem', component: () => import('../pages/Tem/index.vue') }) break } } return [...menuList] }

2. routerGo

经过handleRoutes处理之后,拿到的是一个最终路由格式的数组

 

 

 接下来需要将数组中的内容处理成路由格式:

比如路由中有这样的配置写法,无论是写在本地的还是接口获取的,那么在handleRoutes中它只是一个字符串而已

 

 

 此时通过filterAsyncRouter方法进行处理,将添加完新路由的路由格式的数组传给该方法,依次处理其中的component

function filterAsyncRouter(RouterMap) {
    const accessedRouters = RouterMap.filter(route => {
        route.component = _import(route.name)
        return true
    })
    return accessedRouters
}

在本地开发和在生产环境需要按需加载路由,使用不同的方法

本地:

module.exports = fileanme => require('../pages/' + fileanme).default

生产:

module.exports = fileanme => () => import('../pages/' + fileanme)

处理完毕,对该路由对象执行routerGo方法   调用router的addRoute 方法动态添加路由

vue3 addRoute  一次添加一个路由,可以嵌套子路由  (对象)

所以需要对filterAsyncRouter处理的结果  依次调用addRoute

vue2 addRoutes  把整个路由添加进去 (数组)router.addRoutes(getRouter)

function routerGo(to, next) {
    getRouter = filterAsyncRouter(getRouter)
    getRouter.forEach((val, idx) => {
        router.addRoute(val)
    })
    next({
        ...to,
        replace: true
    })
}

注意: next()接收参数的时候表示中断当前导航,执行新的导航

posted @ 2022-04-20 15:15  行屰  阅读(4691)  评论(0编辑  收藏  举报