You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue Router中router.getRoutes()返回路由顺序与定义不一致的问题

Vue Router getRoutes() 返回顺序与定义不一致的解决方法

问题场景

我使用以下Vue Router配置:

const router = createRouter({
    history: createWebHistory(import.meta.env.BASE_URL),
    routes: [
        {
            path: '/home',
            name: 'Home',
            component: HomeView,
        },
        {
            path: '/dev',
            name: 'Dev',
            component: DevView,
        },
        {
            path: '/dev/components',
            name: 'Components',
            component: ComponentsView,
        },
    ],
});

调用router.getRoutes()获取路由时,返回顺序为:

DevComponents
Home
Dev

但我期望和定义顺序一致:

Home
Dev
DevComponents

修改/dev/components为/components后顺序恢复正常,推测和路由路径长度有关。需要这个顺序来生成动态侧边栏导航。

原因分析

Vue Router内部会对路由进行优先级排序,核心规则是路径更长的路由会被排在前面——这是为了确保子路由能优先匹配,避免父路由先拦截请求导致子路由无法命中。所以/dev/components(路径长度更长)会被排在/dev前面,导致getRoutes()返回的顺序和定义顺序不一致。

解决方案

方案1:直接使用原始路由数组

将路由定义抽成独立变量,侧边栏导航直接使用这个原始数组,而非getRoutes()的结果:

// 单独定义路由数组,保留原始顺序
const appRoutes = [
    {
        path: '/home',
        name: 'Home',
        component: HomeView,
    },
    {
        path: '/dev',
        name: 'Dev',
        component: DevView,
    },
    {
        path: '/dev/components',
        name: 'Components',
        component: ComponentsView,
    },
];

// 创建路由实例时传入该数组
const router = createRouter({
    history: createWebHistory(import.meta.env.BASE_URL),
    routes: appRoutes,
});

之后侧边栏组件直接使用appRoutes生成导航项,完全保持定义时的顺序。

方案2:添加自定义排序字段,手动排序

如果需要使用getRoutes()(比如包含动态添加的路由),可以给每个路由添加自定义排序标识,获取后手动排序:

const appRoutes = [
    {
        path: '/home',
        name: 'Home',
        component: HomeView,
        meta: { sortOrder: 1 } // 自定义排序序号
    },
    {
        path: '/dev',
        name: 'Dev',
        component: DevView,
        meta: { sortOrder: 2 }
    },
    {
        path: '/dev/components',
        name: 'Components',
        component: ComponentsView,
        meta: { sortOrder: 3 }
    },
];

const router = createRouter({
    history: createWebHistory(import.meta.env.BASE_URL),
    routes: appRoutes,
});

// 获取路由后按自定义字段排序
const sortedRoutes = router.getRoutes().sort((a, b) => a.meta.sortOrder - b.meta.sortOrder);

用sortedRoutes作为侧边栏的数据源即可。

内容的提问来源于stack exchange,提问作者Kevin D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:05:11