java小菜机一枚 2023-10-17 18:40 采纳率: 91.3%
浏览 9
已结题

vite+vue3中能否实现完全的动态路由?

vite+vue3中能否实现完全的动态路由?

我现在是这样写的

import {createRouter, createWebHistory, RouteLocationNormalized} from 'vue-router';
import { jurisdictionStore } from '../stores/jurisdiction.ts';
import {isNotEmptyString} from "../utils/tool.ts";
import {show, showLoading} from '../utils/message.ts';
import { getRouterList } from '../api/routerApi.ts';

interface Meta {
    label: string
}

interface Routes {
  path: string,
  name?: string,
  component: Function,
  meta: Meta
}

export const routes : Routes[]  = [
    {
        path: '/admin/404',
        // @ts-ignore
        component: () : string => import('../pages/error/Admin404.vue'),
        meta: {
            label: '404-找不到页面'
        }
    },
    {
        path: '/404',
        name: '404-找不到页面',
        // @ts-ignore
        component: () : string => import('../pages/error/404.vue'),
        meta: {
            label: '404页面'
        }
    }
];

const router = createRouter({
    history: createWebHistory(),
    // @ts-ignore
    routes: routes
});

router.beforeEach((to : RouteLocationNormalized, from : RouteLocationNormalized) : void => {
    console.log(to,from);
    // @ts-ignore
    let jurisdictionId : number  = jurisdictionStore().getJurisdictionId.value;
    getRouterList(jurisdictionId).then(response => {
        for (let i : number = 0; i < response.length; i++) {
            let componentPath : string = '../pages' + response[i].component;
            routes.push({
                ...response[i],
                // @ts-ignore
                component: () : string => import(componentPath)
            });
        }
        console.log(routes);
    }).catch(err => {
        console.log('错误原因: ' + err.message);
        show('error','获取路由列表失败,请刷新重试!');
        showLoading(false);
    });
});

router.afterEach((to : RouteLocationNormalized) : void => {
    let title = to.meta.title;
    // @ts-ignore
    if (isNotEmptyString(title)) {
        // 修改html的标题为meta中的名称
        // @ts-ignore
        document.title = title;
    }
})

export default router;

我现在获取到的结果是这样的

[
  {
        path: '/admin/404',
        // @ts-ignore
        component: () : string => import('../pages/error/Admin404.vue'),
        meta: {
            label: '404-找不到页面'
        }
    },
    {
        path: '/404',
        name: '404-找不到页面',
        // @ts-ignore
        component: () : string => import('../pages/error/404.vue'),
        meta: {
            label: '404页面'
        }
    },
    {
        path: '/',
        name: 'index',
        // @ts-ignore
        component: () : () => import(__vite__injectQuery(componentPath, 'import')),
        meta: {
            label: '首页'
        }
    }
]

有什么办法做到吗?

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-10-17 18:56
    关注

    引自强大而免费的微信小程序:皆我百晓生


    在 Vite + Vue 3 中可以实现完全的动态路由。您可以使用 Vue Router 的 addRoute 方法来动态添加路由。

    首先,您需要将路由的创建和全局路由实例的创建分开。在这种情况下,您可以在单独的模块中创建一个空的路由实例。

    // router.js
    import { createRouter, createWebHistory } from 'vue-router';
    
    export const router = createRouter({
      history: createWebHistory(),
      routes: []
    });
    

    接下来,您可以在获取到路由列表的回调函数中使用 addRoute 方法来动态添加路由。

    // main.js
    import { createApp } from 'vue';
    import { router } from './router';
    import App from './App.vue';
    
    // 获取路由列表
    getRouterList(jurisdictionId).then(response => {
      for (let i = 0; i < response.length; i++) {
        let route = {
          path: response[i].path,
          name: response[i].name,
          component: () => import(`../pages${response[i].component}`),
          meta: {
            label: response[i].label
          }
        };
        router.addRoute(route);
      }
    }).catch(err => {
      console.log('错误原因: ' + err.message);
      show('error', '获取路由列表失败,请刷新重试!');
      showLoading(false);
    });
    
    createApp(App).use(router).mount('#app');
    

    这样,您就可以动态添加路由了。请注意,动态添加路由需要在路由实例创建之后执行。否则,将无法正常添加路由。

    希望对您有所帮助!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月6日
  • 已采纳回答 5月29日
  • 修改了问题 10月17日
  • 创建了问题 10月17日

悬赏问题

  • ¥15 C++ 菜单窗口独立出来,可以随意移动放大缩小。
  • ¥15 java代码写在记事本上后在cmd上运行时无报错但又没生成文件
  • ¥15 关于#python#的问题:在跑ldsc数据整理的时候一直抱这种错误,要么--out识别不了参数,要么--merge-alleles识别不了参数(操作系统-linux)
  • ¥15 PPOCRLabel
  • ¥15 网友们我该怎么办啊,急
  • ¥15 混合键合键合机对准标识
  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 目标跟踪,计算机视觉
  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
  • ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?