feat(router): 支持通过 activeMenuName 指定菜单高亮路径
All checks were successful
CI/CD Pipeline / playwright (push) Successful in 2m18s
CI/CD Pipeline / build-and-deploy (push) Successful in 4m24s

This commit is contained in:
严浩
2025-11-03 15:54:11 +08:00
parent f9f82e4d29
commit 166d76d980
7 changed files with 47 additions and 5 deletions

View File

@@ -17,10 +17,17 @@ export function useMetaLayoutsNMenuOptions({ menuInstRef }: { menuInstRef: Ref<M
const selectedKey = ref('');
watch(
() => router.currentRoute.value.path,
(newPath) => {
selectedKey.value = newPath;
menuInstRef.value?.showOption(newPath); // 展开菜单,确保设定的元素被显示,如果不传入 key 会展示当前选中元素
() => router.currentRoute.value,
(route) => {
// 优先使用 activeMenuName通过路由名称解析为路径如果没有则使用当前路径
const activeMenuPath = route.meta.activeMenuName
? router.resolve({ name: route.meta.activeMenuName }).path
: route.path;
console.debug(`route.meta.activeMenuName :>> `, route.meta.activeMenuName);
selectedKey.value = activeMenuPath;
menuInstRef.value?.showOption(activeMenuPath); // 展开菜单,确保设定的元素被显示
},
{ immediate: true },
);

View File

@@ -10,4 +10,5 @@ export default {
DemosWebsocketDemo: 'WebSocket Demo',
Home: 'Home',
Login: 'Login',
DemosCreate: 'Create Demo',
} satisfies PageTitleLocalizations;

View File

@@ -10,4 +10,5 @@ export default {
DemosWebsocketDemo: 'WebSocket 示例',
Home: '首页',
Login: '登录',
DemosCreate: '创建示例',
} satisfies PageTitleLocalizations;

View File

@@ -0,0 +1,12 @@
<script setup lang="ts">
definePage({
meta: {
hideInMenu: true,
activeMenuName: 'Demos',
},
});
</script>
<template>
<div></div>
</template>

View File

@@ -2,6 +2,6 @@
<template>
<div>
<h1>Index Page</h1>
<n-button @click="$router.push({ name: 'DemosCreate' })">DemosCreate</n-button>
</div>
</template>

View File

@@ -38,5 +38,13 @@ declare module 'vue-router' {
* @description 是否忽略权限,默认为 false
*/
ignoreAuth?: boolean;
/**
* @description 当前路由激活时应该高亮的菜单项(通过路由名称指定)
* - 用于隐藏在菜单中的子页面,指定其父级菜单项应该高亮
* - 使用路由名称而非路径,提供更好的类型安全和重构友好性
* - 例如:`activeMenuName: 'Demos'` 会高亮 Demos 菜单项
*/
activeMenuName?: keyof RouteNamedMap;
}
}