VUE实现路由自动生成,根据src文件夹下(多级文件夹)所有.vue文件路径实现路由自动匹配生成

12 篇文章 0 订阅

我们在写vue项目的时候,总是需要手动的去为每一个.vue文件去手动设置路由,这样做很麻烦,也会占用大量的时间去维护开发,那么有没有一种方法可以自动生成我们vue项目所需的路由?就想其他的前端框架那样?可以吗?

答案:可以

一、知识点及原理

1、原理:require.context
webpack提供了一个context方法来获取到目录下的所有文件,我们可以通过require.context方法拿到我们想要的指定文件夹下所有的vue文件。
webpack require.context官方文档
require.context有三个参数:

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

require.context()的返回值,有一个keys方法,返回的是个数组:
2、知识点:forEach、replace、push、module(语法)、Vue Router

二、具体实现方式

1、新建routes.js文件(router文件夹)

//routes.js
//递归获取src文件夹下的所有.vue文件
const files = require.context('@/', true, /.vue/)
let pages = {};
//生成路由规则
let generator = [];
files.keys().forEach(key => {
  pages[key.replace(/(\.\/|\.vue)/g, '')] = files(key).default;
});
//生成所有路由,并去除一级文件夹名称
Object.keys(pages).forEach(item => {
  let Rpath=item.replace(new RegExp('views','g'),"").replace(new RegExp('components','g'),"");
  if (item!=='App') {
    generator.push({
        path: Rpath,
        name:Rpath,
        meta:{
          active:Rpath
        },
        component: pages[item]
    })
  }
  
});
//将生成路由导入合并
const routes = [
  ...generator,
];
console.log('路由',routes)
export default routes;

2、新建index.js文件(router文件夹)

import Vue from 'vue'
import VueRouter from 'vue-router'
//router.js导入生成好的路由规则
import routerRoutes from "./routes";
Vue.use(VueRouter)
const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: routerRoutes,//导入自动生成的所有路由规则
  scrollBehavior: (to, from, savedPosition) => {
    if (savedPosition) {
      return savedPosition;
    } else {
      return {
        x: 0,
        y: 0
      };
    }
  },
});
export default router

通过上面的两步,我们就具体实现了vue项目的路由自动匹配生成,无论几级文件夹都可以自动匹配生成相关的路由规则,而我们如要使用,直接写文件地址即可跳转,上面只是初步实现了路由的自动生成,URL传值,meta定制,路由守卫这些还有待继续完善,如觉的写的不错,欢迎评论讨论,本文为原创,如需转载请标明出处;

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
这是一个非常不错的自动路由生成的方法,使用 `require.context` 可以快速地遍历 views 文件夹下的所有 .vue 文件。下面是一个示例代码: ```javascript import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) // 生成路由配置 function generateRoutes(routeContext) { const routes = [] // 遍历所有 .vue 文件 routeContext.keys().forEach(key => { // 获取文件相对路径,如 './User.vue' const routePath = key.replace(/^\.\/(.*)\.\w+$/, '$1') // 根据文件路径生成路由配置 const routeConfig = { path: `/${routePath}`, name: routePath, component: () => import(`@/views/${routePath}.vue`) } // 判断是否是一级路由 if (routePath === 'Login' || routePath === 'Home') { routes.push(routeConfig) } else { const [parentPath, childPath] = routePath.split('/') let parentRoute = routes.find(route => route.path === `/${parentPath}`) if (!parentRoute) { parentRoute = { path: `/${parentPath}`, component: () => import(`@/views/${parentPath}/index.vue`), children: [] } routes.push(parentRoute) } parentRoute.children.push(routeConfig) } }) return routes } // 使用 require.context 生成路由配置 const routeContext = require.context('@/views', true, /\.vue$/) const routes = generateRoutes(routeContext) // 创建路由实例 const router = new Router({ mode: 'history', routes }) export default router ``` 在上面的代码中,我们首先定义了 `generateRoutes` 函数,它接受一个 `require.context` 对象作为参数,遍历所有 .vue 文件,根据文件路径生成路由配置。根据要求,Login.vue 和 Home.vue 固定在 views 下作为一级路由,其他和 Login.vue 同一目录下的 vue 文件也是一级路由,其他文件夹下的 vue 文件以 index.vue 作为出口,且文件夹下的 index.vue 均在 Home.vue 的 children 下,其他文件夹下的除 index.vue 文件路由均在 index.vue 的 children 下。 然后,我们使用 `require.context` 生成路由配置,并调用 `generateRoutes` 函数生成路由配置数组。最后,我们使用 `new Router` 创建路由实例,并将路由配置数组作为参数传入。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值