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
    评论
实现路由守卫可以通过 Vue Router 提供的 beforeEach 和 afterEach 钩子函数来实现。在 Vue3 + TypeScript 项目中,可以按照以下步骤实现路由守卫: 1. 在 main.ts 文件中创建 Vue Router 实例,可以定义全局前置守卫和后置守卫: ```typescript import { createRouter, createWebHistory } from 'vue-router'; import { RouteRecordRaw } from 'vue-router'; const routes: Array<RouteRecordRaw> = [ // 路由配置 ]; const router = createRouter({ history: createWebHistory(), routes }); router.beforeEach((to, from, next) => { // 全局前置守卫 }); router.afterEach((to, from) => { // 全局后置守卫 }); export default router; ``` 2. 在路由配置中添加 meta 属性,用于存储需要验证的信息: ```typescript const routes: Array<RouteRecordRaw> = [ { path: '/', name: 'Home', component: Home, meta: { requiresAuth: true } }, // 其他路由配置 ]; ``` 3. 在全局前置守卫中判断路由是否需要验证,如果需要,则进行相关操作: ```typescript router.beforeEach((to, from, next) => { if (to.meta.requiresAuth) { // 判断用户是否登录 const isLoggedIn = true; // 假设用户已经登录,实际情况需要根据具体业务来判断 if (isLoggedIn) { next(); } else { next('/login'); // 未登录则跳转到登录页面 } } else { next(); } }); ``` 4. 在组件中使用路由守卫: ```typescript import { defineComponent } from 'vue'; import { RouteLocationNormalized } from 'vue-router'; export default defineComponent({ name: 'Home', beforeRouteEnter(to: RouteLocationNormalized, from: RouteLocationNormalized, next: any) { // 进入路由前的守卫 next(); }, beforeRouteLeave(to: RouteLocationNormalized, from: RouteLocationNormalized, next: any) { // 离开路由前的守卫 next(); } }); ``` 以上就是在 Vue3 + TypeScript 项目中实现路由守卫的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值