ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-08-18 19:00:21  阅读:127  来源: 互联网

标签: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,路由
来源: https://www.cnblogs.com/wq2022/p/16599774.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有