From 79ad9275d006c9e4941251c2d4845854f13455ff Mon Sep 17 00:00:00 2001 From: Zzz1zz Date: Mon, 13 Oct 2025 00:14:15 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/menu/menu.tsx | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/components/menu/menu.tsx b/src/components/menu/menu.tsx index b3c16b1..bbdadc1 100644 --- a/src/components/menu/menu.tsx +++ b/src/components/menu/menu.tsx @@ -1,7 +1,14 @@ // src/components/menu/MenuContent.tsx import { defineComponent, ref, h, compile, computed } from 'vue'; import { useI18n } from 'vue-i18n'; -import { useRoute, useRouter, RouteRecordRaw } from 'vue-router'; +import { + useRoute, + useRouter, + RouteRecordRaw, + RouteLocationNormalized, + RouteLocationAsPathGeneric, + RouteLocationAsRelativeGeneric, +} from 'vue-router'; import type { RouteMeta } from 'vue-router'; import { useAppStore } from '@/store'; import { listenerRouteChange } from '@/utils/route-listener'; @@ -36,8 +43,29 @@ export default defineComponent({ selectedKey.value = [item.name as string]; return; } + // if (item.redirect) { + // router.push(item.redirect); + // return; + // } if (item.redirect) { - router.push(item.redirect); + // 1. 定义 redirect 结果的类型(匹配 router.push 接受的参数类型) + let redirectTarget: + | string + | RouteLocationAsRelativeGeneric + | RouteLocationAsPathGeneric; + + // 2. 判断 redirect 是否为函数(动态重定向) + if (typeof item.redirect === 'function') { + // 执行函数:需要传入当前路由对象(route 是 useRoute() 获取的当前路由) + // RouteLocationNormalized 是当前路由的完整类型 + redirectTarget = item.redirect(route as RouteLocationNormalized); + } else { + // 静态重定向:直接使用 redirect 值(字符串/对象) + redirectTarget = item.redirect; + } + + // 3. 执行重定向(此时 redirectTarget 类型完全匹配 router.push 要求) + router.push(redirectTarget); return; } const { hideInMenu, activeMenu } = item.meta as RouteMeta;