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 相关文章推荐
用js遍历 table的脚本
Jul 23 Javascript
js实现简单秒表走动的时钟特效
Mar 25 Javascript
js实现的动画导航菜单效果代码
Sep 10 Javascript
深入剖析javascript中的exec与match方法
May 18 Javascript
Angular4实现动态添加删除表单输入框功能
Aug 11 Javascript
jQuery plugin animsition使用小结
Sep 14 jQuery
vue实现在表格里,取每行的id的方法
Mar 09 Javascript
微信小程序实现倒计时补零功能
Jul 09 Javascript
解决Vue router-link绑定事件不生效的问题
Jul 22 Javascript
Vue实现boradcast和dispatch的示例
Nov 13 Javascript
用javascript实现倒计时效果
Feb 09 Javascript
vue中三级导航的菜单权限控制
Mar 31 Vue.js
微信公众号平台接口开发 获取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
PHP答题类应用接口实例
2015/02/09 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
php简单创建zip压缩文件的方法
2016/04/30 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
javascript CSS画图之基础篇
2009/07/29 Javascript
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
2013/02/26 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
基于JS组件实现拖动滑块验证功能(代码分享)
2016/11/18 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
vue进入页面时滚动条始终在底部代码实例
2019/03/26 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
Python实现井字棋小游戏
2020/03/09 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
中学教师师德师风演讲稿
2014/08/22 职场文书
成本会计实训报告
2014/11/05 职场文书
乡镇团委工作总结2015
2015/05/26 职场文书
详解Oracle块修改跟踪功能
2021/11/07 Oracle