首页 > 其他分享 >自动根据文件目录生成vue路由

自动根据文件目录生成vue路由

时间:2022-08-18 19:00:15浏览次数:43  
标签:arr vue const return length router 文件目录 children 路由

前言

每创建一个新的页面需要手动添加路由虽然不是很麻烦的动作,但是也是很繁琐的动作,如果能够再创建文件的时候自动生成路由还是能省一些动作避免一些错误,比如导入路径不对、文件名写错等也不失为一种好的方法。

 

不意外的导入依赖

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

 

配置添加路由规则

const filterOptions = {
  include: [],
  exclude: ['test']
}

 

关键代码

需要添加路由的文件必须放在“children”文件夹里面

function genRouters ({ include, exclude }) {
  const contexts = require.context(
    '../views/',
    true,
    /\.\/(((?!\/).)*|(.*)?children\/(.*)?)\/index\.vue$/,
    'lazy'
  )
  const routers = []
  const pathArray = contexts
    .keys()
    .map(dir => {
      const arr = dir
        .slice(dir.indexOf('/') + 1, dir.lastIndexOf('/'))
        .split('/')
      return filterRouters(arr[0]) ? arr : []
    })
    .sort((a, b) => a.length - b.length)

  function filterRouters (router) {
    if (!include.length && exclude.length) {
      return exclude.indexOf(router) === -1
    }
    if (include.length && !exclude.length) return include.indexOf(router) > -1
    if (include.length && exclude.length) {
      return exclude.indexOf(router) === -1 && include.indexOf(router) > -1
    }
  }

  function path2Routers (arr, result = [], i = 0) {
    let el = arr[i++]
    if (!el) return
    if (el === 'children') {
      el = arr[i++]
    }
    const filterItem = result.filter(item => item.name === el)[0]
    if (filterItem) {
      path2Routers(arr, filterItem.children, i)
    } else {
      const path = arr.slice(0, i).join('/')
      const obj = {
        name: el,
        children: [],
        path: '/' + path.replace(/\/children/g, ''),
        component: () =>
                    import(/* webpackChunkName: "index-[request]" */
                      /* webpackInclude: /children(\/|\\).*(\/|\\)index\.vue$/ */
                      `../views/${path}`)
      }
      result.push(obj)
      path2Routers(arr, obj.children, i)
    }
    return result
  }

  pathArray.forEach(item => {
    if (!item.length) return
    const name = item[0]
    if (item.length === 1) {
      routers.push({
        name,
        children: [],
        path: `/${name}`,
        component: () =>
                    import(/* webpackChunkName: "index-[request]" */
                      /* webpackInclude: /views(\/|\\)((?!(\/|\\)).)*(\/|\\)index\.vue$/ */
                      `../views/${name}`)
      })
    } else {
      path2Routers(item, routers)
    }
  })

  return routers
}

 

创建路由实例

const router = new Router({
  routes: [{
    path: '/',
    redirect: '/login'
  },
  ...genRouters(filterOptions)
  ]
})

 

导航守卫

router.beforeEach((to, from, next) => {
  // do something...
  NProgress.start()
  next()
})

router.afterEach((to, from) => {
  // do something...
  NProgress.done()
})

export default router

 

标签:arr,vue,const,return,length,router,文件目录,children,路由
From: https://www.cnblogs.com/wq2022/p/16599774.html

相关文章

  • vue eventbus 注意点
    如果a页面想在一开始就给B页面传值,那么b页面应在created函数里面接受,同时要先解绑一下事件($off)   ......
  • linux 路由配置
    如下图所示有两个网络,分别是0网段和2网段,路由器1组成0网段,路由器2从路由器一种分出一个2网段    如果要在不同网段直接通讯,需要添加路由,linux添加路由命令如下:r......
  • vue学习之------Windows PowerShell不识别vue命令
    已经全局安装了vue-cli,但是WindowsPowerShell不识别vue命令: 解决办法:1、以管理员身份运行PowerShell2、执行set-ExecutionPolicyRemoteSigned3、输入Y,回车,即可......
  • vue的相关
    报错:Vuepackagesversionmismatch:[email protected](D:\nodejs\node_global\node_modules\vue\dist\vue.runtime.common.js)[email protected](D:\nodejs\n......
  • springbot+vue项目的打包部署
    springbot+vue项目的打包部署使用vue进行前后端分离式开发,但最终部署还是要将前端放到后端中统一部署。一、打包1.前端打包(1)流程通常,我们的前端是在VsCode中开发的,......
  • vue学习之------vue-router【导航守卫】
    导航守卫可以控制路由的访问权限。全局导航守卫会拦截每个路由规则,从而对每个路由进行访问权限的控制。打印一个值看看:  举例:需要登陆才能访问后台管理系统 ......
  • Vue 中引入 json 的三种方法
    Vue中引入json的三种方法 json的定义:JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。JSON是JS对象的字符串表示法,它使用文本表示一个JS对象......
  • 双网卡、多网卡指定IP分别访问网卡(windows添加静态路由)
    有两块网卡,网关分别是128.0.100.198和192.168.10.2,128.0.100.198,网速10M。192.168.10.2,网速100M。平时上网用192.168.10.2,访问指定的IP时用128.0.100.198。需要指定通......
  • Vue-Element-ui Cascader 级联选择器
    Vue-Element-uiCascader级联选择器 基本属性介绍:<el-cascaderv-model="selectedKeys"//v-model绑定的selectedKeys接收的是数组类型:options="par......
  • Vue开发常见插件
    Vue项目无论是前端项目还是移动端项目,优先推荐使用VSCode作为编译工具。VSCode从使用的角度来说没有IDEA用着方便,但是从Vue的支持程度来说,还是不错的,所以优先推荐大家使......