vue 自动化路由实现代码


Posted in Javascript onSeptember 03, 2019

1.需求描述

在写vue的项目中,一般情况下我们每添加一个新页面都得添加一个新路由。为此我们在项目中会专门的一个文件夹来管理路由,如下图所示

vue 自动化路由实现代码

那么有没有一种方案,能够实现我们在文件夹中新建了一个vue文件,就自动帮我们添加路由。特别在我们的一个ERP后台项目中,我们几乎都是一个文件夹下有很多子文件,子文件中一般包含index.vue, detail.vue, edit.vue,分别对应的事列表页,详情页和编辑页。

vue 自动化路由实现代码

上图是我们的文件目录,views文件夹中存放的是所有的页面,goodsPlanning是一级目录,onNewComplete和thirdGoods是二级目录,二级目录中存放的是具体的页面,indexComponents中存放的是index.vue的文件,editComponents也是同样的道理。index.vue对应的路由是/goodsPlanning/onNewComplete, edit.vue对应的路由是/goodsPlanning/onNewComplete/edit,detail.vue也是同样的道理。所以我们的文件夹和路由是完全能够对应上的,只要知道路由,就能很快的找到对应的文件。那么有没有办法能够读取我们二级目录下的所有文件,然后根据文件名来生成路由呢?答案是有的

2. require.context介绍

官方文档require.context

简单说就是:有了require.context,我们可以得到指定文件夹下的所有文件

require.context(directory, useSubdirectories = false, regExp = /^\.\//);

require.context有三个参数:

  • directory:说明需要检索的目录
  • useSubdirectories:是否检索子目录
  • regExp: 匹配文件的正则表达式

require.context()的返回值,有一个keys方法,返回的是个数组

let routers = require.context('VIEWS', true).keys()
console.log(routers)

vue 自动化路由实现代码

通过上面的代码,我们打印出了所有的views文件夹下的所有文件和文件夹,我们只要写好正则就能找到我们所需要的文件

3.直接上代码

import Layout from 'VIEWS/layout/index'
/**
 * 正则 首先匹配./ ,然后一级目录,不包含components的二级目录,以.vue结尾的三级目录
 */
let routers = require.context('VIEWS', true, /\.\/[a-z]+\/(?!components)[a-z]+\/[a-z]+\.vue$/i).keys()
let indexRouterMap = {} // 用来存储以index.vue结尾的文件,因为index.vue是列表文件,需要加入layout(我们的菜单),需要keepAlive,需要做权限判断
let detailRouterArr = [] // 用来存储以非index.vue结尾的vue文件,此类目前不需要layout
routers.forEach(item => {
 const paths = item.match(/[a-zA-Z]+/g) //paths中存储了一个目录,二级目录,文件名
 const routerChild = { //定义路由对象
  path: paths[1],   
  name: `${paths[0]}${_.upperFirst(paths[1])}`,  //upperFirst,lodash 首字母大写方法
  component(resolve) {
   require([`../../views${item.slice(1)}`], resolve)
  },
 }
 if (/index\.vue$/.test(item)) { //判断是否以index。vue结尾
  if (indexRouterMap[paths[0]]) {  //判断一级路由是否存在,存在push二级路由,不存在则新建
   indexRouterMap[paths[0]].children.push(routerChild)
  } else {
   indexRouterMap[paths[0]] = {
    path: '/' + paths[0],
    component: Layout,
    children: [routerChild]
   }
  }
 } else {   //不以index.vue结尾的,直接添加到路由中
  detailRouterArr.push({
   path: item.slice(1, -4),  //渠道最前面的 . 和最后的.vue
   name: `${paths[0]}${_.upperFirst(paths[1])}${_.upperFirst(paths[2])}`,
   component(resolve) {
    require([`../../views${item.slice(1)}`], resolve)
   },
   meta: {
    noCache: true,  //不keepAlive
    noVerify: true  //不做权限验证
   }
  })
 }
})
export default [
 ...Object.values(indexRouterMap),
 ...detailRouterArr,
 /**
  * dashboard单独处理下
  */
 {
  path: '',
  component: Layout,
  redirect: 'dashboard',
  children: [
   {
    path: 'dashboard',
    component: () => import('VIEWS/dashboard/index'),
    name: 'dashboard',
    meta: { title: '首页', noCache: true, noVerify: true }
   }
  ]
 },
]

简简单单的几十行代码就实现了所有的路由功能,再也不用一行一行的写路由文件了。可能你的文件管理方式和我的不一样,但是只要稍微改改正则就行了。

4. 注意

  1. 不能用import引入路由,因为用import引入不支持变量
  2. 不能用别名,找了半天问题,才知道用变量时也不能用别名,所以我用的都是相对路径

5.好处

  • 不用在添加路由了,这个就不说了,明眼人都看得出来
  • 知道了路由,一个能找到对应的文件,以前我们团队就出现过,乱写path的情况
  • 更好的控制验证和keepAlive

总结

以上所述是小编给大家介绍的vue 自动化路由实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jQuery 验证插件 Web前端设计模式(asp.net)
Oct 17 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
Feb 11 Javascript
关于Javascript加载执行优化的研究报告
Dec 16 Javascript
node.js中的fs.fchmodSync方法使用说明
Dec 16 Javascript
javascript 小数乘法结果错误的处理方法
Jul 28 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
Jul 18 Javascript
jQuery对底部导航进行跳转并高亮显示的实例代码
Apr 23 jQuery
layui 上传文件_批量导入数据UI的方法
Sep 23 Javascript
Vue简单实现原理详解
May 07 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
Aug 14 Javascript
vue element-ui中table合计指定列求和实例
Nov 02 Javascript
Vue3.0 手写放大镜效果
Jul 25 Vue.js
vue中npm包全局安装和局部安装过程
Sep 03 #Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
Sep 03 #jQuery
Webpack中loader打包各种文件的方法实例
Sep 03 #Javascript
JavaScript 预解析的4种实现方法解析
Sep 03 #Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
Sep 03 #jQuery
js tab栏切换代码实例解析
Sep 03 #Javascript
解决layui 三级联动下拉框更新时回显的问题
Sep 03 #Javascript
You might like
利用PHP动态生成VRML网页
2006/10/09 PHP
我用php+mysql写的留言本
2006/10/09 PHP
php切割页面div内容的实现代码分享
2012/07/31 PHP
php修改NetBeans默认字体的大小
2013/07/02 PHP
PHP提高编程效率的20个要点
2015/09/23 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
图片onload事件触发问题解决方法
2011/07/31 Javascript
jQuery渐变发光导航菜单的实例代码
2013/03/27 Javascript
JavaScript中window、doucment、body的解释
2013/08/14 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
中文输入法不触发onkeyup事件的解决办法
2014/07/09 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
微信小程序云开发(数据库)详解
2019/05/17 Javascript
Vue使用NProgress进度条的方法
2019/09/21 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
[01:46]辉夜杯—打造中国DOTA新格局
2015/12/25 DOTA
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
Python使用cx_Freeze库生成msi格式安装文件的方法
2018/07/10 Python
python实现剪切功能
2019/01/23 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
2020/07/06 Python
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
设计师珠宝:Ylang 23
2018/05/11 全球购物
大学生思想汇报范文
2013/12/31 职场文书
采购部经理岗位职责
2014/02/10 职场文书
媒体宣传策划方案
2014/05/25 职场文书
工程服务质量承诺书
2015/04/29 职场文书
2019大学竞选班长发言稿
2019/06/27 职场文书
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android