Skip to content

Commit 1ed4923

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

File tree

3 files changed

+15
-17
lines changed

3 files changed

+15
-17
lines changed

components/menu/src/Menu.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ export default defineComponent({
373373
registerMenuInfo,
374374
unRegisterMenuInfo,
375375
selectedSubMenuEventKeys,
376-
isRootMenu: true,
376+
isRootMenu: ref(true),
377377
expandIcon: props.expandIcon || slots.expandIcon,
378378
});
379379
return () => {

components/menu/src/PopupTrigger.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ export default defineComponent({
8080
)}
8181
stretch={mode === 'horizontal' ? 'minWidth' : null}
8282
getPopupContainer={
83-
isRootMenu ? getPopupContainer.value : triggerNode => triggerNode.parentNode
83+
isRootMenu.value ? getPopupContainer.value : triggerNode => triggerNode.parentNode
8484
}
8585
builtinPlacements={placement.value}
8686
popupPlacement={popupPlacement.value}

components/menu/src/hooks/useMenuContext.ts

+13-15
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import type { Key } from '../../../_util/type';
22
import type { ComputedRef, CSSProperties, InjectionKey, PropType, Ref, UnwrapRef } from 'vue';
3-
import { toRef } from 'vue';
4-
import { watchEffect } from 'vue';
5-
import { defineComponent, inject, provide } from 'vue';
3+
import { defineComponent, inject, provide, toRef } from 'vue';
64
import type {
75
BuiltinPlacements,
86
MenuClickEventHandler,
@@ -21,7 +19,7 @@ export interface StoreMenuInfo {
2119
parentKeys: ComputedRef<Key[]>;
2220
}
2321
export interface MenuContextProps {
24-
isRootMenu: boolean;
22+
isRootMenu: Ref<boolean>;
2523

2624
store: Ref<Record<string, UnwrapRef<StoreMenuInfo>>>;
2725
registerMenuInfo: (key: string, info: StoreMenuInfo) => void;
@@ -115,17 +113,17 @@ const MenuContextProvider = defineComponent({
115113
setup(props, { slots }) {
116114
const menuContext = useInjectMenu();
117115
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-
});
116+
// 确保传入的属性不会动态增删
117+
// 不需要 watch 变化
118+
if (props.mode !== undefined) {
119+
newContext.mode = toRef(props, 'mode');
120+
}
121+
if (props.isRootMenu !== undefined) {
122+
newContext.isRootMenu = toRef(props, 'isRootMenu');
123+
}
124+
if (props.overflowDisabled !== undefined) {
125+
newContext.overflowDisabled = toRef(props, 'overflowDisabled');
126+
}
129127
useProvideMenu(newContext);
130128
return () => slots.default?.();
131129
},

0 commit comments

Comments
 (0)