Vue路由模块化配置的完整步骤

前言

企业运营后台页面很多,路由如若不区分模块化配置,所有路由挤在同一个文件将不好维护,所以路由的配置也要模块化

分享两个解决方案 —— Vue 路由配置的模块化(Plan A and Plan B)

注册需要

首先路由注册需要啥

// main.js

new Vue({
 el: \'#app\',
 router,
 store,
 components: { App },
 template: \'<App/>\'
})

// 这里的 router 是这样的
export default new Router({
 mode: \'history\',
 routes: [],
 ... // 其他配置
})

也就是说注册需要 new 一个 Router 实例,实例里的 routes 是数组,里面配置每个页面的路由

模块拆分(Plan A)

src 下 router 的目录结构

—src
—-router
——modules
——–xxxx.js // 模块 xxx
——–other.js // 模块 other
——index.js // 路由配置入口和出口 index

例如

Vue路由模块化配置的完整步骤

然后配置 modules 里面模块路由

// 配置 other
import err from \'@/views/others/Error.vue\'
export default function(router) {
 router.push({
  path: \'/error\',
  name: \'error\',
  component: err
 })
}
// 配置 accoutReport
export default function(router) {
 router.push({
  path: \'/accout-report\',
  redirect: \'/accout-report/list\'
 })
 // 列表
 router.push({
  path: \'/accout-report/list\',
  name: \'list\',
  component: () => import(\'@/views/accoutReport/List.vue\')
 })
 // 新增
 router.push({
  path: \'/accout-report/create\',
  name: \'create\',
  component: () => import(\'@/views/accoutReport/Create.vue\')
 })
 // 编辑
 router.push({
  path: \'/accout-report/edit/:id\',
  name: \'edit\',
  component: () => import(\'@/views/accoutReport/steps/CreateStep2.vue\')
 })
 // 详情
 router.push({
  path: \'/accout-report/detail/:id\',
  name: \'detail\',
  component: () => import(\'@/views/accoutReport/Detail.vue\')
 })
}

如有其他模块,依次像上面一样配置

关键是路由配置入口出口文件 index.js

// index.js
import Vue from \'vue\'
import Router from \'vue-router\'
import App from \'@/views/Layouts.vue\'
import otherRouter from \'@/router/modules/others\'
import accoutReport from \'@/router/modules/accoutReport\'
// import store from \'@/stores\'
Vue.use(Router)

let routes = []

let rootRouter = {
 path: \'/\',
 component: App,
 children: [],
 redirect: \'/accout-report/list\'
}

let redirectRouter = {
 path: \'*\',
 redirect: \'/error\'
}

otherRouter(rootRouter.children)
accoutReport(rootRouter.children)
// 如有多个模块,依次在这里配置

const router = new Router({
 mode: \'history\',
 routes: routes.concat([rootRouter, redirectRouter])
})
export default router

上述代码,除了 other,所有页面路由配置在 rootRouter 的 children 下面,有一个父级 router 包裹着
代码都看得懂,这里就不多说哈~

最后在 main.js 中注册

模块拆分(Plan B)

该方法较为难懂一些,可以看看

目录结构跟 Plan A 类似,不过在 src 下多了一个 router.js 配置文件作为路由出口文件

src 下 router 的目录结构

—src
—-router
——modules
——–xxxx.js // 模块 xxx
——–other.js // 模块 other
——index.js // 路由配置中转文件
—-router.js // 路由配置出口文件

例如

Vue路由模块化配置的完整步骤

模块 modules 里文件配置

// order.js
import { getFindBusinessServiceList } from \'@/utils/config-utils\'

const OrderRouter = [
 {
  path: \'/\',
  redirect: \'/cost/order-list\'
 },
 {
  path: \'/cost\',
  component: () => import(\'@/views/Layouts\'),
  redirect: \'/cost/order-list\',
  children: [
   {
    path: \'order-list\',
    component: () => import(\'@/views/orderManagement/List\'),
    beforeEnter: async (to, from, next) => {
     await getFindBusinessServiceList() // 进入该路由前异步请求,结束后进入该路由
     next()
    }
   },
   {
    path: \'order-detail\',
    component: () => import(\'@/views/orderManagement/Detail\')
   },
   // 下面是重定向,可不配置
   {
    path: \'orderDetail\',
    redirect: \'order-detail\'
   },
   {
    path: \'order\',
    redirect: \'order-list\'
   }
  ]
 }
]
export default OrderRouter

上述路由配置在 Layouts 路由下的 children

接下来关键,路由配置中转文件 index.js

遍历 modules 文件夹下的每个模块文件,赋值和导出

// index.js
import { camelCase } from \'lodash-es\'
const requiredModules = require.context(\'./modules\', false, /\\.js$/)
const routers = {}

requiredModules.keys().forEach(fileName => {
 // 不加载index.js
 if (fileName === \'./index.js\') return
 // 转为驼峰命名
 const moduleName = camelCase(fileName.replace(/(\\.\\/|\\.js)/g, \'\'))

 routers[moduleName] =
  requiredModules(fileName).default || requiredModules(fileName)
})
export default routers

然后在 src 下的出口文件 router.js 包装

// router.js
import Vue from \'vue\'
import Router from \'vue-router\'
import routers from \'@/routers/index\'
Vue.use(Router)
let routes = []
Object.values(routers).forEach(router => {
 routes.push(...router)
})

export default new Router({
 mode: \'history\',
 routes
})

最后在 main.js 中注册

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容