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


Posted in Javascript onAugust 14, 2019

前言

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

分享两个解决方案 —— 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 中注册

总结

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

Javascript 相关文章推荐
彪哥1.1(智能表格)提供下载
Sep 07 Javascript
javascript 表单验证常见正则
Sep 28 Javascript
jQuery对象[0]是什么含义?
Jul 31 Javascript
jQuery.query.js 取参数的两点问题分析
Aug 06 Javascript
JavaScript高级程序设计(第3版)学习笔记5 js语句
Oct 11 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
May 30 Javascript
js实现正方形颜色从下往上升的效果
Aug 04 Javascript
整理Javascript流程控制语句学习笔记
Nov 29 Javascript
纯JS实现表单验证实例
Dec 24 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
Feb 10 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
Oct 30 Javascript
Vue实现移动端页面切换效果【推荐】
Nov 13 Javascript
微信公众号平台接口开发 获取access_token过程解析
Aug 14 #Javascript
解决vue中使用proxy配置不同端口和ip接口问题
Aug 14 #Javascript
websocket4.0+typescript 实现热更新的方法
Aug 14 #Javascript
利用JavaScript的Map提升性能的方法详解
Aug 14 #Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
Aug 13 #Javascript
vue源码nextTick使用及原理解析
Aug 13 #Javascript
封装微信小程序http拦截器过程解析
Aug 13 #Javascript
You might like
基于mysql的论坛(3)
2006/10/09 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
php+mysql数据库实现无限分类的方法
2014/12/12 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
php 问卷调查结果统计
2015/10/08 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
理解Javascript_10_对象模型
2010/10/16 Javascript
JavaScript中split() 使用方法汇总
2015/04/17 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
使用JS正则表达式 替换括号,尖括号等
2016/11/29 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
Vue header组件开发详解
2018/01/26 Javascript
微信小程序开发摇一摇功能
2019/11/22 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
[47:55]Ti4第二日主赛事败者组 NaVi vs EG 1
2014/07/20 DOTA
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
Python 文件和输入输出小结
2013/10/09 Python
python实现保存网页到本地示例
2014/03/16 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
Python生成8位随机字符串的方法分析
2017/12/05 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
StubHub巴西:购买和出售您的门票
2016/07/22 全球购物
美国汽车交易网站:Edmunds
2016/08/17 全球购物
英国电动工具购买网站:Anglia Tool Centre
2017/04/25 全球购物
如何设置Java的运行环境
2013/04/05 面试题
连锁酒店店长职责范本
2014/02/13 职场文书
爱国主义演讲稿
2014/05/07 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
技术员岗位职责范本
2015/04/11 职场文书
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android