reset-routes.ts 1.1 KB

12345678910111213141516171819202122232425262728293031
  1. import type { Router, RouteRecordName, RouteRecordRaw } from 'vue-router';
  2. import { traverseTreeValues } from '@vben-core/shared/utils';
  3. /**
  4. * @zh_CN 重置所有路由,如有指定白名单除外
  5. */
  6. export function resetStaticRoutes(router: Router, routes: RouteRecordRaw[]) {
  7. // 获取静态路由所有节点包含子节点的 name,并排除不存在 name 字段的路由
  8. const staticRouteNames = traverseTreeValues<
  9. RouteRecordRaw,
  10. RouteRecordName | undefined
  11. >(routes, (route) => {
  12. // 这些路由需要指定 name,防止在路由重置时,不能删除没有指定 name 的路由
  13. if (!route.name) {
  14. console.warn(
  15. `The route with the path ${route.path} needs to have the field name specified.`,
  16. );
  17. }
  18. return route.name;
  19. });
  20. const { getRoutes, hasRoute, removeRoute } = router;
  21. const allRoutes = getRoutes();
  22. allRoutes.forEach(({ name }) => {
  23. // 存在于路由表且非白名单才需要删除
  24. if (name && !staticRouteNames.includes(name) && hasRoute(name)) {
  25. removeRoute(name);
  26. }
  27. });
  28. }