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 ajaxSubmit 异步提交的简单实现
Feb 28 Javascript
js 创建对象 经典模式全面了解
Aug 16 Javascript
jquery层级选择器的实现(匹配后代元素div)
Sep 05 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
Mar 21 Javascript
JS实现向iframe中表单传值的方法
Mar 24 Javascript
纯js实现的积木(div层)拖动功能示例
Jul 19 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
Dec 25 Javascript
JavaScript从原型到原型链深入理解
Jun 03 Javascript
Vue数据绑定实例写法
Aug 06 Javascript
Vuex中实现数据状态查询与更改
Nov 08 Javascript
node爬取新型冠状病毒的疫情实时动态
Feb 06 Javascript
JS轮播图的实现方法
Aug 24 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
基于文本的搜索
2006/10/09 PHP
PHP 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
优化php效率,提高php性能的一些方法
2011/03/24 PHP
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
PHP APC缓存配置、使用详解
2014/03/06 PHP
用PHP来计算某个目录大小的方法
2014/04/01 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
JavaScript 版本自动生成文章摘要
2008/07/23 Javascript
两个JavaScript jsFiddle JSBin在线调试器
2010/03/14 Javascript
JavaScript定义类或函数的几种方式小结
2011/01/09 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
Javascript简单改变表单元素背景的方法
2015/07/15 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
vue print.js打印支持Echarts图表操作
2020/11/13 Javascript
JavaScript实现商品评价五星好评
2020/11/30 Javascript
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
乔迁之喜主持词
2014/03/27 职场文书
建筑工程技术专业求职信
2014/07/16 职场文书
庆七一活动总结
2014/08/27 职场文书
群众路线班子对照检查材料
2014/09/25 职场文书
前台接待岗位职责
2015/02/03 职场文书
投标单位介绍信
2015/05/05 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
学子宴致辞大全
2015/07/27 职场文书
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫