Skip to content

Commit 386f3d0

Browse files
committed
perf: update menu
1 parent 5bdd6f4 commit 386f3d0

File tree

5 files changed

+30
-23
lines changed

5 files changed

+30
-23
lines changed

components/form/FormItem.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { PropType, ExtractPropTypes, ComputedRef, watch } from 'vue';
1+
import type { PropType, ExtractPropTypes, ComputedRef } from 'vue';
2+
import { watch } from 'vue';
23
import { defineComponent, computed, nextTick, ref, watchEffect, onBeforeUnmount } from 'vue';
34
import cloneDeep from 'lodash-es/cloneDeep';
45
import PropTypes from '../_util/vue-types';

components/menu/src/InlineSubMenuList.tsx

+3-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { computed, defineComponent, ref, watch } from 'vue';
22
import Transition from '../../_util/transition';
33
import { useInjectMenu, MenuContextProvider } from './hooks/useMenuContext';
4+
import type { MenuMode } from './interface';
45
import SubMenuList from './SubMenuList';
56

67
export default defineComponent({
@@ -12,7 +13,7 @@ export default defineComponent({
1213
keyPath: Array,
1314
},
1415
setup(props, { slots }) {
15-
const fixedMode = computed(() => 'inline');
16+
const fixedMode = computed<MenuMode>(() => 'inline');
1617
const { motion, mode, defaultMotions } = useInjectMenu();
1718
const sameModeRef = computed(() => mode.value === fixedMode.value);
1819
const destroy = ref(!sameModeRef.value);
@@ -43,12 +44,7 @@ export default defineComponent({
4344
return null;
4445
}
4546
return (
46-
<MenuContextProvider
47-
props={{
48-
mode: fixedMode,
49-
locked: !sameModeRef.value,
50-
}}
51-
>
47+
<MenuContextProvider mode={fixedMode.value}>
5248
<Transition {...mergedMotion.value}>
5349
<SubMenuList
5450
v-show={mergedOpen.value}

components/menu/src/Menu.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ export default defineComponent({
367367
siderCollapsed,
368368
defaultMotions: computed(() => (isMounted.value ? defaultMotions : null)),
369369
motion: computed(() => (isMounted.value ? props.motion : null)),
370-
overflowDisabled: computed(() => undefined),
370+
overflowDisabled: ref(undefined),
371371
onOpenChange: onInternalOpenChange,
372372
onItemClick: onInternalClick,
373373
registerMenuInfo,
@@ -391,7 +391,7 @@ export default defineComponent({
391391
// Always wrap provider to avoid sub node re-mount
392392
<MenuContextProvider
393393
key={child.key}
394-
props={{ overflowDisabled: computed(() => index > lastVisibleIndex.value) }}
394+
overflowDisabled={index > lastVisibleIndex.value}
395395
>
396396
{child}
397397
</MenuContextProvider>

components/menu/src/SubMenu.tsx

+2-7
Original file line numberDiff line numberDiff line change
@@ -268,12 +268,7 @@ export default defineComponent({
268268
onVisibleChange={onPopupVisibleChange}
269269
v-slots={{
270270
popup: ({ visible }) => (
271-
<MenuContextProvider
272-
props={{
273-
mode: subMenuTriggerModeRef,
274-
isRootMenu: false,
275-
}}
276-
>
271+
<MenuContextProvider mode={subMenuTriggerModeRef.value} isRootMenu={false}>
277272
<Transition {...mergedMotion.value}>
278273
<SubMenuList v-show={visible} id={popupId} ref={popupRef}>
279274
{slots.default?.()}
@@ -292,7 +287,7 @@ export default defineComponent({
292287
titleNode = <PopupTrigger>{titleNode}</PopupTrigger>;
293288
}
294289
return (
295-
<MenuContextProvider props={{ mode: renderMode }}>
290+
<MenuContextProvider mode={renderMode.value}>
296291
<Overflow.Item
297292
component="li"
298293
{...attrs}

components/menu/src/hooks/useMenuContext.ts

+21-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import type { Key } from '../../../_util/type';
2-
import type { ComputedRef, CSSProperties, InjectionKey, Ref, UnwrapRef } from 'vue';
2+
import type { ComputedRef, CSSProperties, InjectionKey, PropType, Ref, UnwrapRef } from 'vue';
3+
import { toRef } from 'vue';
4+
import { watchEffect } from 'vue';
35
import { defineComponent, inject, provide } from 'vue';
46
import type {
57
BuiltinPlacements,
@@ -31,8 +33,6 @@ export interface MenuContextProps {
3133
selectedSubMenuEventKeys: Ref<string[]>;
3234
rtl?: ComputedRef<boolean>;
3335

34-
locked?: Ref<boolean>;
35-
3636
inlineCollapsed: Ref<boolean>;
3737
antdMenuTheme?: ComputedRef<MenuTheme>;
3838

@@ -44,7 +44,7 @@ export interface MenuContextProps {
4444
// // Disabled
4545
disabled?: ComputedRef<boolean>;
4646
// // Used for overflow only. Prevent hidden node trigger open
47-
overflowDisabled?: ComputedRef<boolean>;
47+
overflowDisabled?: Ref<boolean>;
4848

4949
// // Active
5050
activeKeys: Ref<Key[]>;
@@ -108,10 +108,25 @@ const MenuContextProvider = defineComponent({
108108
name: 'MenuContextProvider',
109109
inheritAttrs: false,
110110
props: {
111-
props: Object,
111+
mode: { type: String as PropType<MenuMode>, default: undefined },
112+
overflowDisabled: { type: Boolean, default: undefined },
113+
isRootMenu: { type: Boolean, default: undefined },
112114
},
113115
setup(props, { slots }) {
114-
useProvideMenu({ ...useInjectMenu(), ...props.props });
116+
const menuContext = useInjectMenu();
117+
const newContext = { ...menuContext };
118+
watchEffect(() => {
119+
if (props.mode !== undefined) {
120+
newContext.mode = toRef(props, 'mode');
121+
}
122+
if (props.isRootMenu !== undefined) {
123+
newContext.isRootMenu = props.isRootMenu;
124+
}
125+
if (props.overflowDisabled !== undefined) {
126+
newContext.overflowDisabled = toRef(props, 'overflowDisabled');
127+
}
128+
});
129+
useProvideMenu(newContext);
115130
return () => slots.default?.();
116131
},
117132
});

0 commit comments

Comments
 (0)