首页 > 其他分享 >vue3 动态路由生成

vue3 动态路由生成

时间:2024-06-13 15:46:19浏览次数:17  
标签:const component 生成 vue3 import 动态 dynamicRoutes 路由

动态路由生成----vue3

stores/index.js

import { defineStore } from 'pinia';

export const useRouteStore = defineStore('route', {
  state: () => ({
    dynamicRoutes: false
  })
});

router/index.js

import {createRouter, createWebHistory} from 'vue-router'
import HomeView from '../views/HomeView.vue'
import UserView from '../views/UserView.vue'
import axios from 'axios';
import {useRouteStore} from '../stores/index.js';

const router = createRouter({
    history: createWebHistory(import.meta.env.BASE_URL),
    routes: [
        {
            path: '/',
            name: 'home',
            component: HomeView,
            children: [
                {
                    path: '/user',
                    name: 'user',
                    component: UserView,
                },
            ],
        }
    ], // 使用 generateRoutes() 函数生成路由配置
});


// 在路由实例创建后再调用 generateRoutes() 函数
router.beforeEach(async (to, from, next) => {
    const store = useRouteStore()
    if (!store.dynamicRoutes) {
        await generateRoutes();
        store.dynamicRoutes = true
        next({...to, replace:true});
    } else {
        next();
    }

});

async function generateRoutes() {
    // 异步请求获取动态路由数据
    const dynamicRoutesData = await fetchDynamicRoutesData();
    // 根据获取到的数据生成动态路由
    const dynamicRoutes = await generateDynamicRoutes(dynamicRoutesData);
    dynamicRoutes.forEach(route => {
        router.addRoute('home', route); // 将动态生成的路由添加到 'home' 路由的 children 数组中
    });
}

async function fetchDynamicRoutesData() {
    // 发起异步请求获取动态路由数据
    try {
        const response = await axios.get('http://127.0.0.1:8000/api/v1/permission/menu/', {
            headers: {
                'token': localStorage.getItem("token")
            }
        });
        return response.data.results;
    } catch (error) {
        console.error('Failed to fetch dynamic routes data:', error);
        return []; // 返回一个空数组以避免生成动态路由时报错
    }
}

async function generateDynamicRoutes(dynamicRoutesData) {
    // 根据动态路由数据生成路由配置数组
    const dynamicRoutes = [];

    for (const menu of dynamicRoutesData) {
        if (menu.children) {
            for (const e of menu.children) {
                // 动态导入组件
                const component = await import(`../views/${e.component}.vue`);
                // 转成路由
                let route = {
                    name: e.name,
                    path: e.path,
                    component: component.default,
                    meta: {
                        icon: e.icon,
                        title: e.title
                    }
                };
                // 将路由添加到动态路由数组中
                dynamicRoutes.push(route);
            }
        }
    }

    return dynamicRoutes;
}

export default router;

标签:const,component,生成,vue3,import,动态,dynamicRoutes,路由
From: https://www.cnblogs.com/unrealqcc/p/18245999

相关文章

  • Electron生成 exe
    需求:打包PC桌面程序,前提条件:1、node(有个nvm管理工具可以管理不同的node版本)2、Electron官网入口 步骤:1、安装前置内容2、编辑main.jspackage.js preload.js文件//main.js//Modulestocontrolapplicationlifeandcreatenativebrowserwindowconst{......
  • vite+vue3展示文件夹内的所有组件
    https://www.cnblogs.com/y-shmily/p/16546743.html 在组件目录下新建index.jsimport{markRaw}from"vue";constfilesNameList=[];constfiles=import.meta.glob("./*.vue");for(constkeyinfiles){constfileName=key.replace(/(\.......
  • 文心一言Prompt优化:生成高质量的对话
    本文由ChatMoney团队出品随着人工智能技术的快速发展,对话生成系统已经成为人机交互的重要形式之一。作为百度研发的知识增强大模型,文心一言在对话生成领域展现出强大的潜力。然而,要实现高质量、高准确率的对话生成,除了模型本身的性能外,Prompt(提示词)的设计和优化同样至关重要。本......
  • 实验3 中间代码生成 *语法制导的代码+生成语句代码生成+条件判断语句代码生成
    实验3中间代码生成help-assignment代码已完成除了语法树,编译器里另一个核心数据结构就是中间代码(IntermediateRepresentation,IR)。中间代码是编译器从源语言到目标语言之间采用的一种过渡性质的代码形式,往往介于语法树和汇编代码之间,其表示独立于机器,易于分析和翻译......
  • BGP路由优选实验(包含as策略,Community属性等)
    实验背景实验目的1.使用AS_PATH属性,确保R4通过R3到达192.168.11.0/242.使用LOCAL_PREF属性,确保R1通过R2到达192.168.1.0/243.使用MED属性,确认R4通过R3到达192.168.12.0/244.使用LOCAL_PREF属性,确保R1通过R3到达192.168.2.0/245.使用AS策略,AS500不接受任何始发于AS1......
  • Android studio 自动复制生成的 apk
    KTS脚本//顶层build.gradle.ktsvalapkBaseName:String="VoiceAssistant"allprojects{project.extra.apply{set("apkBaseName",apkBaseName)}}//模块build.gradle.ktsandroid{ applicationVariants.all{......
  • java+vue3+el-tree实现树形结构操作
    基于springboot+vue3elementPlus实现树形结构数据的添加、删除和页面展示效果如下代码如下,业务部分可以自行修改java后台代码importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importcom.daztk.mes.common.annotation.LogOperation;import......
  • vue3 修改element-plus主题颜色(css版)
    vue3修改主题颜色_若依vue3改默认主题色-CSDN博客上面的是js修改-----------------------------------------------------------------------------------------------------------------------1.新建一个APPStyle.css文件代码/*8这里是要替换的样式,可以参开下面注释......
  • 国思RDIF.vNext全新低代码快速开发框架平台6.1版本发布(支持vue2、vue3)
    1、平台介绍RDIF.vNext,全新低代码快速开发集成框架平台,给用户和开发者最佳的.Net框架平台方案,为企业快速构建跨平台、企业级的应用提供强大支持。RDIF.vNext的前身是RDIFramework框架,RDIF(RapiddevelopIntegrateFramework,vNext代表全新下一代),全新设计,全新开发,代码量减......
  • vue3探索——在setup script中使用tsx语法
    vue3+ts+eslint配置tsxvite.config.ts安装@vitejs/plugin-vue-jsx#npmnpmi@vitejs/plugin-vue-jsx-D#yarnyarnadd@vitejs/plugin-vue-jsx-D#pnpmpnpmadd@vitejs/plugin-vue-jsx-D在vite.config.ts中使用……importvueJsxfrom'@vitejs/plugin-vue......