前端页面自动遍历文件夹生成路由

文章介绍了如何在Vue项目中利用require.context()方法自动注册路由,避免手动修改路由文件。通过在router.js中导入views文件夹中的所有页面,动态生成路由配置,适用于每次添加新页面时无需更新路由表的情况。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

views文件夹下添加页面后需手动修改路由文件、注册路由才能正常显示页面。每次新增页面都要去修改路由文件太麻烦,可以直接在路由文件中使用require.context()方法导入所有页面文件,拿到文件之后,遍历文件名注册组件,这样以后新增页面的时候就不用再去修改路由文件了。

一、注册路由

1. 项目目录结构图:

在这里插入图片描述

2. 在router文件夹下新建router.js文件,在router/index.js中引入router.js文件并注册路由。

router/index.js页面:

import Vue from "vue";
import Router from "vue-router" // 引入router
import staticRouter from "./router"; // 引入router.js文件

Vue.use(Router) // 注册路由插件

export default new Router({
    routes: staticRouter
})

3. 在main.js中引入路由,并初始化。

main.js文件:

import Vue from 'vue'
import App from './App.vue'
import router from '@/router/index'; // 引入
Vue.config.productionTip = false;

new Vue({
  router, // 初始化
  render: h => h(App),
}).$mount('#app')

二、自动生成路由配置表

1.使用require.context()方法导入文件目录

require.context(directory,useSubdirectories,regExp)

参数:
directory:要检索的目录

useSubdirectories:是否检索子文件夹
(如果选择false,只能检索子文件,不会检索子文件夹。当前目录里只有文件夹的话,会导致什么都检索不到)

regExp:匹配文件的正则表达式,一般是文件名

const fileName = require.context('../views',true,/^\.\/[a-zA-Z0-9]+$/);
 // /^\.\/[a-zA-Z0-9]+$/ 匹配字符 ==>  ./开头+数字/字母结尾  ==>  如:./program124,类型数据
console.log('fileName=====',fileName); 
// fileName===== ƒ webpackContext(req) {
	// var id = webpackContextResolve(req);
	// return __webpack_require__(id);
// }
console.log('fileName.keys======',fileName.keys()); 
// fileName.keys====== ['./program1', './program10', './program2', './program3', './program4', './program5', './program6', './program7', './program8', './program9', './programA', './programText']

拿到views文件夹下所有子文件夹名字之后,就可以遍历生成前端路由。
这里要注意文件是按字母和数字的先后顺序排列的,名称里面带数字的,会按数字从小到大排序

2.注册layout父路由

在这里插入图片描述

当前项目使用了layout组件,在layout中点击按钮可以切换页面,所以需要注册layout组件为路由父路由,在layout父路由下面挂载子路由页面。

layout.vue文件如下:

<template>
  <div class="layout">
    <div>
      <router-link v-for="(item,index) in butNum" :key="index" :to="item.replace('./','')" :class="{'active': $route.name === item.replace('./','')}">{{ item.replace('./','') }}</router-link>
    </div>
    <router-view />
  </div>
</template>

<script>
export default {
  data() {
    return {
     butNum: []
    }
  },
  created() {
     const fileName = require.context('@/views', true, /^\.\/[a-zA-Z0-9]+$/);
     this.butNum = fileName.keys()
  }
}
</script>
<style lang="less" scoped>
a {
  display: inline-block;
  padding: 5px 15px;
  height: 30px;
  margin: 10px;
  line-height: 30px;
  text-align: center;
  text-decoration: none;
  color: #262626;
  background-color: #f5f5f5;
}
.active {
  background-color: #ffae43;
}
</style>

router.js中注册父路由:

const staticRouter = [{
    path:'/',
    redirect:'/index',
    name:'index',
}]

let layout = {
    path:'/index',
    name:'index',
    component: () => Promise.resolve(require("@/components/XLayout.vue").default),
    children:[{
        path:'/',
        redirect:'/program1',
        name:'program1',
    }]
}

3.遍历生成页面路由

注册完父路由之后,导入views文件夹,拿到views下子文件夹的名字,进行页面子路由的注册。
router.js中注册子路由:

const fileName = require.context('@/views',true,/^\.\/[a-zA-Z0-9]+$/);
fileName.keys().forEach(item=>{
    layout.children.push({
            path:item.replace('.',''), // item第一项为:'./program1',去掉.之后生成path路径
            name:item.replace('./',''),
            component: () => Promise.resolve(require(`@/views/${item.replace('./','')}`).default) // 使用模板文字异步引入对应组件
        })
})
console.log(layout,'1111'); // 打印结果如下图绿色框内容所示
staticRouter.push(layout) // 将layout子路由添加到父路由中

export default staticRouter // 将完整路由表暴露出去,在router/index.js中导入并生成路由

控制台打印数据:
在这里插入图片描述

三、router.js页面完整代码

const fileName = require.context('../views',true,/^\.\/[a-zA-Z0-9]+$/);
console.log('fileName=====',fileName);

const staticRouter = [{
    path:'/',
    redirect:'/index',
    name:'index',
}]

let layout = {
    path:'/index',
    name:'index',
    component: () => Promise.resolve(require("@/components/XLayout.vue").default),
    children:[{
        path:'/',
        redirect:'/program1',
        name:'program1',
    }]
}
console.log('fileName.keys======',fileName.keys()); 
// ['./program1', './program10', './program2', './program3', './program4', './program5', './program6', './program7', './program8', './program9', './programText']
fileName.keys().forEach(item=>{
    layout.children.push({
            path:item.replace('.',''),
            name:item.replace('./',''),
            component: () => Promise.resolve(require(`@/views/${item.replace('./','')}`).default)
        })
})

staticRouter.push(layout)
console.log(layout,'1111');

export default staticRouter

总结

最主要的就是在router.js中遍历生成子路由,并添加进父路由下面。
然后在layout.vue页面也拿到文件名,遍历生成跳转的路径。之后在views下添加其他文件夹,就不用修改路由文件了。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值