浏览代码

fix(menu): fix externalLink not work

vben 4 年之前
父节点
当前提交
7bae4c3752

+ 4 - 2
src/router/helper/menuHelper.ts

@@ -3,6 +3,7 @@ import type { MenuModule, Menu, AppRouteRecordRaw } from '/@/router/types';
 
 import { findPath, forEach, treeMap, treeToList } from '/@/utils/helper/treeHelper';
 import { cloneDeep } from 'lodash-es';
+import { isUrl } from '/@/utils/is';
 
 export function getAllParentPath(treeData: any[], path: string) {
   const menuList = findPath(treeData, (n) => n.path === path) as Menu[];
@@ -39,7 +40,7 @@ export function transformMenuModule(menuModule: MenuModule): Menu {
 
   const menuList = [menu];
   forEach(menuList, (m) => {
-    joinParentPath(menuList, m);
+    !isUrl(m.path) && joinParentPath(menuList, m);
   });
   return menuList[0];
 }
@@ -58,7 +59,8 @@ export function transformRouteToMenu(routeModList: AppRouteModule[]) {
   return treeMap(routeList, {
     conversion: (node: AppRouteRecordRaw) => {
       const { meta: { title, icon } = {} } = node;
-      joinParentPath(routeList, node);
+
+      !isUrl(node.path) && joinParentPath(routeList, node);
       return {
         name: title,
         icon,

+ 6 - 1
src/router/menus/index.ts

@@ -89,12 +89,17 @@ export async function getFlatChildrenMenus(children: Menu[]) {
 function basicFilter(routes: RouteRecordNormalized[]) {
   return (menu: Menu) => {
     const matchRoute = routes.find((route) => {
+      if (route.meta.externalLink) {
+        return true;
+      }
+
       if (route.meta) {
         if (route.meta.carryParam) {
           return pathToRegexp(route.path).test(menu.path);
         }
-        if (route.meta.ignoreAuth) return false;
+        if (route.meta.ignoreAuth) return true;
       }
+
       return route.path === menu.path;
     });
 

+ 1 - 1
src/router/menus/modules/demo/iframe.ts

@@ -15,7 +15,7 @@ const menu: MenuModule = {
         name: 'routes.demo.iframe.doc',
       },
       {
-        path: 'docExternal',
+        path: 'https://vvbin.cn/doc-next/',
         name: 'routes.demo.iframe.docExternal',
       },
     ],

+ 2 - 2
src/router/routes/modules/demo/iframe.ts

@@ -33,11 +33,11 @@ const iframe: AppRouteModule = {
       },
     },
     {
-      path: 'docExternal',
+      path: 'https://vvbin.cn/doc-next/',
       name: 'DocExternal',
       component: IFrame,
       meta: {
-        externalLink: 'https://vvbin.cn/doc-next/',
+        externalLink: true,
         title: 'routes.demo.iframe.docExternal',
       },
     },

+ 2 - 1
src/router/types.d.ts

@@ -17,7 +17,7 @@ export interface RouteMeta {
   // Jump address
   frameSrc?: string;
   // Outer link jump address
-  externalLink?: string;
+  externalLink?: boolean;
 
   // current page transition
   transitionName?: string;
@@ -28,6 +28,7 @@ export interface RouteMeta {
   // Carrying parameters
   carryParam?: boolean;
 
+  // Used internally to mark single-level menus
   single?: boolean;
 }