Merge branch 'fork/Lmx1220/main'

# Conflicts:
#	pnpm-lock.yaml
This commit is contained in:
Jin Mao
2026-03-15 03:53:43 +08:00
10 changed files with 79 additions and 44 deletions

View File

@@ -1,6 +1,8 @@
import type { Component } from 'vue';
import type { RouteRecordRaw } from 'vue-router';
import type { Recordable } from './helper';
/**
* 扩展路由原始对象
*/
@@ -66,6 +68,10 @@ interface MenuRecordRaw extends MenuRecordBadgeRaw {
* 菜单路径唯一可当作key
*/
path: string;
/**
* 菜单参数
*/
query?: Recordable<any>;
/**
* 是否显示菜单
* @default true

View File

@@ -307,14 +307,14 @@ onUnmounted(() => {
<aside
ref="asideRef"
:style="style"
class="fixed top-0 left-0 h-full transition-all duration-150"
class="fixed left-0 top-0 h-full transition-all duration-150"
:class="theme"
@mouseenter="handleMouseenter"
@mouseleave="handleMouseleave"
>
<div
class="h-full"
:class="[
theme,
{
'bg-sidebar-deep': isSidebarMixed,
'border-r border-border bg-sidebar': !isSidebarMixed,

View File

@@ -44,6 +44,10 @@
"@vben-core/shared": "workspace:*",
"@vben-core/typings": "workspace:*",
"@vueuse/core": "catalog:",
"qs": "catalog:",
"vue": "catalog:"
},
"devDependencies": {
"@types/qs": "catalog:"
}
}

View File

@@ -6,6 +6,8 @@ import { computed, onBeforeUnmount, onMounted, reactive, useSlots } from 'vue';
import { useNamespace } from '@vben-core/composables';
import { VbenIcon, VbenTooltip } from '@vben-core/shadcn-ui';
import qs from 'qs';
import { MenuBadge } from '../components';
import { useMenu, useMenuContext, useSubMenuContext } from '../hooks';
@@ -54,6 +56,7 @@ const item: MenuItemRegistered = reactive({
active,
parentPaths: parentPaths.value,
path: props.path || '',
query: props.query,
});
/**
@@ -81,42 +84,50 @@ onBeforeUnmount(() => {
});
</script>
<template>
<li
:class="[
rootMenu.theme,
b(),
is('active', active),
is('disabled', disabled),
is('collapse-show-title', collapseShowTitle),
]"
role="menuitem"
@click.stop="handleClick"
<a
:href="
(item.parentPaths.at(-1) ?? '') +
(item?.query ? `?${qs.stringify(item?.query)}` : '')
"
@click.prevent.stop="handleClick"
>
<VbenTooltip
v-if="showTooltip"
:content-class="[rootMenu.theme]"
side="right"
<li
:class="[
rootMenu.theme,
b(),
is('active', active),
is('disabled', disabled),
is('collapse-show-title', collapseShowTitle),
]"
role="menuitem"
>
<template #trigger>
<div :class="[nsMenu.be('tooltip', 'trigger')]">
<VbenIcon :class="nsMenu.e('icon')" :icon="menuIcon" fallback />
<slot></slot>
<span v-if="collapseShowTitle" :class="nsMenu.e('name')">
<slot name="title"></slot>
</span>
</div>
</template>
<slot name="title"></slot>
</VbenTooltip>
<div v-show="!showTooltip" :class="[e('content')]">
<MenuBadge
v-if="rootMenu.props.mode !== 'horizontal'"
class="right-2"
v-bind="props"
/>
<VbenIcon :class="nsMenu.e('icon')" :icon="menuIcon" />
<slot></slot>
<slot name="title"></slot>
</div>
</li>
<!-- -->
<VbenTooltip
v-if="showTooltip"
:content-class="[rootMenu.theme]"
side="right"
>
<template #trigger>
<div :class="[nsMenu.be('tooltip', 'trigger')]">
<VbenIcon :class="nsMenu.e('icon')" :icon="menuIcon" fallback />
<slot></slot>
<span v-if="collapseShowTitle" :class="nsMenu.e('name')">
<slot name="title"></slot>
</span>
</div>
</template>
<slot name="title"></slot>
</VbenTooltip>
<div v-show="!showTooltip" :class="[e('content')]">
<MenuBadge
v-if="rootMenu.props.mode !== 'horizontal'"
class="right-2"
v-bind="props"
/>
<VbenIcon :class="nsMenu.e('icon')" :icon="menuIcon" />
<slot></slot>
<slot name="title"></slot>
</div>
</li>
</a>
</template>

View File

@@ -212,15 +212,15 @@ const enableScroll = computed(
() => props.scrollToActive && props.mode === 'vertical' && !props.collapse,
);
const { scrollToActiveItem } = useMenuScroll(activePath, {
useMenuScroll(activePath, {
enable: enableScroll,
delay: 320,
});
// 监听 activePath 变化,自动滚动到激活项
watch(activePath, () => {
scrollToActiveItem();
});
// watch(activePath, () => {
// scrollToActiveItem();
// });
// 默认展开菜单
function initMenu() {

View File

@@ -40,6 +40,7 @@ const hasChildren = computed(() => {
:badge-variants="menu.badgeVariants"
:icon="menu.icon"
:path="menu.path"
:query="menu.query"
>
<template #title>
<span>{{ menu.name }}</span>

View File

@@ -1,6 +1,10 @@
import type { Component, Ref } from 'vue';
import type { MenuRecordBadgeRaw, ThemeModeType } from '@vben-core/typings';
import type {
MenuRecordBadgeRaw,
Recordable,
ThemeModeType,
} from '@vben-core/typings';
interface MenuProps {
/**
@@ -91,12 +95,17 @@ interface MenuItemProps extends MenuRecordBadgeRaw {
* @zh_CN menuitem 名称
*/
path: string;
/**
* @zh_CN 菜单所携带的参数
*/
query?: Recordable<any>;
}
interface MenuItemRegistered {
active: boolean;
parentPaths: string[];
path: string;
query?: Recordable<any>;
}
interface MenuItemClicked {