Vue3+ts实现自动注册路由

前言

在开发项目的时候,每增加一个页面,我们都需要手动的添加路由,这就很麻烦。自动注册路由就解决了这个烦恼;有了自动注册路由,我们只需要新建页面,不再需要手动的添加路由,路由就可以自动生成

实现

我们想自动生成的路由结构如下:

{
	path: '',
	name: '',
	component: () => import(''),
	children: [
		{
			path: '',
			name: '',
			component: () => import('')
		},
		{
			path: '',
			name: '',
			component: () => import('')
		}
	]
}

由上面想生成的路由结构可以看出来,不同的页面有可能对应不同的布局,所以我们需要创建布局文件夹layouts,里面存放不同的布局;不同的布局文件里面有可能存在子路由,也就是上面的children。所以我们只需要动态的或许布局路由和布局路由对应的子路由就可以了。

为了使得页面(子路由)和layouts对应起来,我们采用这样的方法:比如在layouts文件夹下存在一个admin的布局文件,那么我们需要在view页面下创建一个admin的文件夹,然后在admin文件夹下新建页面(子路由),效果如下:
在这里插入图片描述
在这里插入图片描述
上述我们在admin布局下新建了一个user页面,在member布局下新建了一个mail页面

代码

1. layouts/admin.vue

<template>
  <h1>admin.vue</h1>
  <router-view />
</template>

<script setup lang="ts">
</script>

<style scoped>
</style>

layouts/member.vue的代码和layouts/admin.vue类似,按自己的需求来

2. 自动注册路由代码

import { RouteRecordRaw } from "vue-router"

const layouts = import.meta.glob('../layouts/*.vue', { eager: true })
const views = import.meta.glob('../views/**/*.vue', { eager: true }) // **的意思是能够遍历到子目录 {eager: true} 为直接引入,不写{eager: true}是动态引入
function getRoutes() {
    const layoutRoutes = [] as RouteRecordRaw[]
    Object.entries(layouts).forEach(([file, module]) => {
        const route = getRouteByModule(file, module)
        route.children = getChildrenRoutes(route)
        layoutRoutes.push(route)
    })
    return layoutRoutes
}

// 获取布局路由的子路由
function getChildrenRoutes(layoutRoute: RouteRecordRaw) {
    // console.log(layoutRoute)
    const routes = [] as RouteRecordRaw[]
    Object.entries(views).forEach(([file, module]) => {
        if (file.includes(`../views/${layoutRoute.name as string}`)) {
            const route = getRouteByModule(file, module)
            routes.push(route)
        }
    })
    return routes
}
// 获取布局路由
function getRouteByModule(file: string, module: { [key: string]: any }) {
    // console.log(file.split('/').pop()?.split('.')[0])
    // console.log(file.match(/\.\.\/layouts\/(?<name>.+)?\.vue/i)?.groups?.name)
    // console.log(file.replace(/.+layouts\/|\.vue/gi, ''))
    const name = file.replace(/.+layouts\/|.+views\/|\.vue/gi, '')
    const route = {
        path: `/${name}`,
        name: name.replace('/', '.'),
        component: module.default,
    } as RouteRecordRaw

    // return route
    return Object.assign(route, module.default?.route)
}

export default getRoutes()

3.在我们创建的router文件夹下的index.ts中使用

import { App } from "vue";
import { createRouter, createWebHistory } from "vue-router";
import layoutRoutes from "./autoload";

const router = createRouter({
    history: createWebHistory(),
    routes: [ 
    	{
        	path: "/",
        	name: 'home',
        	component: () => import("@/views/home.vue")
    	}, 
    	...layoutRoutes
    ]
});

结束

这样就实现了路由的自动注册

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值