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 相关文章推荐
基于Jquery的动态添加控件并取值的实现代码
Sep 24 Javascript
jQuery版仿Path菜单效果
Dec 15 Javascript
jquery星级插件、支持页面中多次使用
Mar 25 Javascript
提交表单时执行func方法实现代码
Mar 17 Javascript
javascript实现单击和双击并存的方法
Dec 13 Javascript
JavaScript操作HTML元素和样式的方法详解
Oct 21 Javascript
js实现数组去重方法及效率?Ρ? target=
Feb 14 Javascript
JavaScript实现隐藏省略文字效果的方法
Apr 27 Javascript
Vue实现导航栏点击当前标签变色功能
Aug 19 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
Dec 20 jQuery
在vue中使用jsonp进行跨域请求接口操作
Oct 29 Javascript
React自定义hook的方法
Jun 25 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
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
Google Map Api和GOOGLE Search Api整合实现代码
2009/07/18 Javascript
jquery中ajax学习笔记3
2011/10/16 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
js实现类似MSN提示的页面效果代码分享
2015/08/24 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
教你用十行node.js代码读取docx的文本
2017/03/08 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
createObjectURL方法实现本地图片预览
2019/09/30 Javascript
[05:08]顺网杯ISS-DOTA2赛歌 少女偶像Lunar青春演绎
2013/12/05 DOTA
[00:37]DOTA2上海特级锦标赛 Secert 战队宣传片
2016/03/03 DOTA
详解python进行mp3格式判断
2016/12/23 Python
Python实现登录接口的示例代码
2017/07/21 Python
Django数据库操作的实例(增删改查)
2017/09/04 Python
详解django三种文件下载方式
2018/04/06 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
基于python连接oracle导并出数据文件
2020/04/28 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
JDO的含义
2012/11/17 面试题
华为c/c++笔试题
2016/01/25 面试题
中间件分为哪几类
2016/09/18 面试题
医学生职业规划范文
2014/01/05 职场文书
通信研究生自荐信
2014/02/01 职场文书
五型班组建设方案
2014/02/10 职场文书
业务员岗位职责范本
2015/04/03 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
理想国读书笔记
2015/06/25 职场文书
幼儿园六一主持词
2015/06/30 职场文书