vue3学习日记(十七):动态路由使用解析
动态路由基础概念
动态路由的核心是借助 vue-router
的 addRoute
方法,通过编程方式添加路由规则。基本流程分为路由定义和动态添加两部分:
路由定义
在初始化时保留静态路由,动态部分通过空数组或占位符预留:
const routes = [{ path: '/', component: Home },{ path: '/user/:id', component: User } // 动态路由参数
];
const router = createRouter({ history: createWebHistory(), routes });
动态添加路由
通过 addRoute
方法在运行时插入新路由规则:
// 添加一级路由
router.addRoute({ path: '/admin', component: AdminPanel });// 添加嵌套路由
router.addRoute('parentRoute', { path: 'child', component: Child });
获取动态参数
在组件内通过 useRoute
获取参数:
import { useRoute } from 'vue-router';
const route = useRoute();
console.log(route.params.id); // 访问 /user/123 输出 "123"
典型应用场景
权限控制
根据用户角色动态生成可访问的路由列表。例如管理员加载 /admin
路由,普通用户仅加载 /dashboard
。
模块懒加载
配合 import()
实现按需加载路由组件:
router.addRoute({path: '/settings',component: () => import('./views/Settings.vue')
});
多租户系统
不同租户显示定制化路由结构,如租户A有 /billing
路由,租户B隐藏该路由。
注意事项
- 路由重复添加:多次调用
addRoute
会导致重复路由,需通过router.hasRoute()
检查。 - 导航守卫顺序:动态路由的守卫可能因添加时机不同而影响执行顺序。推荐在路由添加完成后执行权限校验。
- 热更新问题:开发环境下动态路由可能在热更新时丢失。可通过
router.getRoutes()
备份并重新添加。 - 路由初始化时机:动态路由应在应用挂载前完成,避免白屏。
- SSR兼容性: 服务端渲染需确保动态路由在客户端与服务端同步,避免 hydration 不匹配。
优化与建议
1. 模块化路由管理 将动态路由按功能拆分模块,通过统一接口管理:
// authRoutes.js
export const getAuthRoutes = (permissions) => {return permissions.map(perm => ({path: `/${perm.path}`,component: () => import(`@/views/${perm.component}.vue`),}));
};
2. 路由持久化 结合 localStorage
或 Pinia
存储路由状态,避免刷新丢失:
// 初始化时恢复路由
const savedRoutes = JSON.parse(localStorage.getItem('dynamicRoutes'));
if (savedRoutes) {savedRoutes.forEach(route => router.addRoute(route));
}
3. 异步路由加载 对大型路由使用 import()
实现懒加载,提升首屏速度:
router.addRoute({path: '/admin',component: () => import(/* webpackChunkName: "admin" */ './Admin.vue'),
});
4. 404 路由处理 动态路由需将 404 页面路由置于最后添加:
router.addRoute({ path: '/:pathMatch(.*)*', component: NotFound });
5. TypeScript 支持 为动态路由定义类型保障安全:
interface DynamicRoute {path: string;component: () => Promise<typeof import('*.vue')>;
}const routes: DynamicRoute[] = [...];
6. 服务端配合 建议后端返回扁平化路由结构,减少前端处理复杂度:
{"routes": [{ "path": "/dashboard", "component": "Dashboard" },{ "path": "/user/:id", "component": "User" }]
}
总结
动态路由适合权限复杂、模块化程度高的项目。建议遵循以下实践:
- 使用路由元信息(meta)存储权限标识,便于统一校验
- 对动态路由进行持久化存储(如 localStorage),避免刷新丢失
- 在路由切换时添加加载状态,提升用户体验
- 生产环境应处理动态导入失败的情况(如组件加载错误)
通过合理设计动态路由,可显著提升应用的可扩展性和安全性,尤其适合中后台管理系统。