Skip to content

Commit 94e981e

Browse files
committed
refactor: menu
1 parent 221b203 commit 94e981e

File tree

18 files changed

+1220
-1126
lines changed

18 files changed

+1220
-1126
lines changed

components/menu/src/Menu.tsx

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ import type { FocusEventHandler, MouseEventHandler } from '../../_util/EventInte
4141
import collapseMotion from '../../_util/collapseMotion';
4242
import type { ItemType } from './hooks/useItems';
4343
import useItems from './hooks/useItems';
44+
import useStyle from '../style';
45+
import { useInjectOverride } from './OverrideContext';
4446

4547
export const menuProps = () => ({
4648
id: String,
@@ -95,7 +97,17 @@ export default defineComponent({
9597
props: menuProps(),
9698
slots: ['expandIcon', 'overflowedIndicator'],
9799
setup(props, { slots, emit, attrs }) {
98-
const { prefixCls, direction, getPrefixCls } = useConfigInject('menu', props);
100+
const { direction, getPrefixCls } = useConfigInject('menu', props);
101+
const override = useInjectOverride();
102+
const prefixCls = computed(() => {
103+
return getPrefixCls('menu', props.prefixCls || override?.prefixCls?.value);
104+
});
105+
const [wrapSSR, hashId] = useStyle(
106+
prefixCls,
107+
computed(() => {
108+
return !override;
109+
}),
110+
);
99111
const store = shallowRef<Map<string, StoreMenuInfo>>(new Map());
100112
const siderCollapsed = inject(SiderCollapsedKey, ref(undefined));
101113
const inlineCollapsed = computed(() => {
@@ -265,6 +277,9 @@ export default defineComponent({
265277
mergedMode.value = props.mode;
266278
mergedInlineCollapsed.value = false;
267279
}
280+
if (override?.mode?.value) {
281+
mergedMode.value = override.mode.value;
282+
}
268283
});
269284

270285
const isInlineMode = computed(() => mergedMode.value === 'inline');
@@ -346,6 +361,7 @@ export default defineComponent({
346361
const onInternalClick = (info: MenuInfo) => {
347362
emit('click', info);
348363
triggerSelection(info);
364+
override?.onClick?.();
349365
};
350366

351367
const onInternalOpenChange = (key: Key, open: boolean) => {
@@ -406,7 +422,7 @@ export default defineComponent({
406422
triggerSubMenuAction: computed(() => props.triggerSubMenuAction),
407423
getPopupContainer: computed(() => props.getPopupContainer),
408424
inlineCollapsed: mergedInlineCollapsed,
409-
antdMenuTheme: computed(() => props.theme),
425+
theme: computed(() => props.theme),
410426
siderCollapsed,
411427
defaultMotions: computed(() => (isMounted.value ? defaultMotions.value : null)),
412428
motion: computed(() => (isMounted.value ? props.motion : null)),
@@ -419,7 +435,7 @@ export default defineComponent({
419435
isRootMenu: ref(true),
420436
expandIcon,
421437
forceSubMenuRender: computed(() => props.forceSubMenuRender),
422-
rootClassName: computed(() => ''),
438+
rootClassName: hashId,
423439
});
424440
return () => {
425441
const childList = itemsNodes.value || flattenChildren(slots.default?.());
@@ -442,14 +458,14 @@ export default defineComponent({
442458
));
443459
const overflowedIndicator = slots.overflowedIndicator?.() || <EllipsisOutlined />;
444460

445-
return (
461+
return wrapSSR(
446462
<Overflow
447463
{...attrs}
448464
onMousedown={props.onMousedown}
449465
prefixCls={`${prefixCls.value}-overflow`}
450466
component="ul"
451467
itemComponent={MenuItem}
452-
class={[className.value, attrs.class]}
468+
class={[className.value, attrs.class, hashId.value]}
453469
role="menu"
454470
id={props.id}
455471
data={wrappedChildList}
@@ -499,7 +515,7 @@ export default defineComponent({
499515
<PathContext>{wrappedChildList}</PathContext>
500516
</div>
501517
</Teleport>
502-
</Overflow>
518+
</Overflow>,
503519
);
504520
};
505521
},
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import type { ComputedRef, InjectionKey } from 'vue';
2+
import { provide, computed, inject } from 'vue';
3+
import type { MenuProps } from './menu';
4+
5+
// Used for Dropdown only
6+
export interface OverrideContextProps {
7+
prefixCls?: ComputedRef<string>;
8+
mode?: ComputedRef<MenuProps['mode']>;
9+
selectable?: ComputedRef<boolean>;
10+
validator?: (menuProps: Pick<MenuProps, 'mode'>) => void;
11+
onClick?: () => void;
12+
}
13+
export const OverrideContextKey: InjectionKey<OverrideContextProps> = Symbol('OverrideContextKey');
14+
export const useInjectOverride = () => {
15+
return inject(OverrideContextKey, undefined);
16+
};
17+
18+
export const useProvideOverride = (props: OverrideContextProps) => {
19+
const { prefixCls, mode, selectable, validator, onClick } = useInjectOverride() || {};
20+
provide(OverrideContextKey, {
21+
prefixCls: computed(() => (props.prefixCls?.value ?? prefixCls?.value) as string),
22+
mode: computed(() => props.mode?.value ?? mode?.value),
23+
selectable: computed(() => (props.selectable?.value ?? selectable?.value) as boolean),
24+
validator: props.validator ?? validator,
25+
onClick: props.onClick ?? onClick,
26+
});
27+
};

components/menu/src/SubMenu.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,14 @@ export default defineComponent({
9393
changeActiveKeys,
9494
mode,
9595
inlineCollapsed,
96-
antdMenuTheme,
9796
openKeys,
9897
overflowDisabled,
9998
onOpenChange,
10099
registerMenuInfo,
101100
unRegisterMenuInfo,
102101
selectedSubMenuKeys,
103102
expandIcon: menuExpandIcon,
103+
theme,
104104
} = useInjectMenu();
105105

106106
const hasKey = vnodeKey !== undefined && vnodeKey !== null;
@@ -196,7 +196,7 @@ export default defineComponent({
196196
const popupClassName = computed(() =>
197197
classNames(
198198
prefixCls.value,
199-
`${prefixCls.value}-${props.theme || antdMenuTheme.value}`,
199+
`${prefixCls.value}-${props.theme || theme.value}`,
200200
props.popupClassName,
201201
),
202202
);
@@ -279,13 +279,14 @@ export default defineComponent({
279279
const subMenuPrefixClsValue = subMenuPrefixCls.value;
280280
let titleNode = () => null;
281281
if (!overflowDisabled.value && mode.value !== 'inline') {
282+
const popupOffset = mode.value === 'horizontal' ? [0, 8] : [10, 0];
282283
titleNode = () => (
283284
<PopupTrigger
284285
mode={triggerModeRef.value}
285286
prefixCls={subMenuPrefixClsValue}
286287
visible={!props.internalPopupClose && open.value}
287288
popupClassName={popupClassName.value}
288-
popupOffset={props.popupOffset}
289+
popupOffset={props.popupOffset || popupOffset}
289290
disabled={mergedDisabled.value}
290291
onVisibleChange={onPopupVisibleChange}
291292
v-slots={{

components/menu/src/hooks/useItems.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,24 @@ import { ref, shallowRef, watch } from 'vue';
1313
import type { MenuProps } from '../Menu';
1414
import type { StoreMenuInfo } from './useMenuContext';
1515

16-
interface MenuItemType extends VcMenuItemType {
16+
export interface MenuItemType extends VcMenuItemType {
1717
danger?: boolean;
1818
icon?: any;
1919
title?: string;
2020
}
2121

22-
interface SubMenuType extends Omit<VcSubMenuType, 'children'> {
22+
export interface SubMenuType extends Omit<VcSubMenuType, 'children'> {
2323
icon?: any;
2424
theme?: 'dark' | 'light';
2525
children: ItemType[];
2626
}
2727

28-
interface MenuItemGroupType extends Omit<VcMenuItemGroupType, 'children'> {
28+
export interface MenuItemGroupType extends Omit<VcMenuItemGroupType, 'children'> {
2929
children?: MenuItemType[];
3030
key?: Key;
3131
}
3232

33-
interface MenuDividerType extends VcMenuDividerType {
33+
export interface MenuDividerType extends VcMenuDividerType {
3434
dashed?: boolean;
3535
key?: Key;
3636
}

components/menu/src/hooks/useMenuContext.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export interface MenuContextProps {
3131
rtl?: ComputedRef<boolean>;
3232

3333
inlineCollapsed: Ref<boolean>;
34-
antdMenuTheme?: ComputedRef<MenuTheme>;
34+
theme?: ComputedRef<MenuTheme>;
3535

3636
siderCollapsed?: ComputedRef<boolean>;
3737

components/menu/style/dark.less

Lines changed: 0 additions & 177 deletions
This file was deleted.

0 commit comments

Comments
 (0)