Skip to content

Commit 61d6312

Browse files
committed
fix: dropdown menu hide error
1 parent 98be707 commit 61d6312

File tree

7 files changed

+51
-50
lines changed

7 files changed

+51
-50
lines changed

components/menu/src/Menu.tsx

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export const menuProps = () => ({
6565
mode: { type: String as PropType<MenuMode>, default: 'vertical' },
6666

6767
inlineIndent: { type: Number, default: 24 },
68-
subMenuOpenDelay: { type: Number, default: 0.1 },
68+
subMenuOpenDelay: { type: Number, default: 0 },
6969
subMenuCloseDelay: { type: Number, default: 0.1 },
7070

7171
builtinPlacements: { type: Object as PropType<BuiltinPlacements> },
@@ -201,41 +201,40 @@ export default defineComponent({
201201

202202
// >>>>> Trigger select
203203
const triggerSelection = (info: MenuInfo) => {
204-
if (!props.selectable) {
205-
return;
206-
}
207-
// Insert or Remove
208-
const { key: targetKey } = info;
209-
const exist = mergedSelectedKeys.value.includes(targetKey);
210-
let newSelectedKeys: Key[];
211-
212-
if (props.multiple) {
213-
if (exist) {
214-
newSelectedKeys = mergedSelectedKeys.value.filter(key => key !== targetKey);
204+
if (props.selectable) {
205+
// Insert or Remove
206+
const { key: targetKey } = info;
207+
const exist = mergedSelectedKeys.value.includes(targetKey);
208+
let newSelectedKeys: Key[];
209+
210+
if (props.multiple) {
211+
if (exist) {
212+
newSelectedKeys = mergedSelectedKeys.value.filter(key => key !== targetKey);
213+
} else {
214+
newSelectedKeys = [...mergedSelectedKeys.value, targetKey];
215+
}
215216
} else {
216-
newSelectedKeys = [...mergedSelectedKeys.value, targetKey];
217+
newSelectedKeys = [targetKey];
217218
}
218-
} else {
219-
newSelectedKeys = [targetKey];
220-
}
221219

222-
// Trigger event
223-
const selectInfo: SelectInfo = {
224-
...info,
225-
selectedKeys: newSelectedKeys,
226-
};
227-
if (!shallowEqual(newSelectedKeys, mergedSelectedKeys.value)) {
228-
if (props.selectedKeys === undefined) {
229-
mergedSelectedKeys.value = newSelectedKeys;
230-
}
231-
emit('update:selectedKeys', newSelectedKeys);
232-
if (exist && props.multiple) {
233-
emit('deselect', selectInfo);
234-
} else {
235-
emit('select', selectInfo);
220+
// Trigger event
221+
const selectInfo: SelectInfo = {
222+
...info,
223+
selectedKeys: newSelectedKeys,
224+
};
225+
if (!shallowEqual(newSelectedKeys, mergedSelectedKeys.value)) {
226+
if (props.selectedKeys === undefined) {
227+
mergedSelectedKeys.value = newSelectedKeys;
228+
}
229+
emit('update:selectedKeys', newSelectedKeys);
230+
if (exist && props.multiple) {
231+
emit('deselect', selectInfo);
232+
} else {
233+
emit('select', selectInfo);
234+
}
236235
}
237236
}
238-
237+
// Whatever selectable, always close it
239238
if (mergedMode.value !== 'inline' && !props.multiple && mergedOpenKeys.value.length) {
240239
triggerOpenKeys(EMPTY_LIST);
241240
}
@@ -432,7 +431,6 @@ export default defineComponent({
432431
registerMenuInfo,
433432
unRegisterMenuInfo,
434433
selectedSubMenuKeys,
435-
isRootMenu: shallowRef(true),
436434
expandIcon,
437435
forceSubMenuRender: computed(() => props.forceSubMenuRender),
438436
rootClassName: hashId,

components/menu/src/PopupTrigger.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ export default defineComponent({
3939
subMenuCloseDelay,
4040
builtinPlacements,
4141
triggerSubMenuAction,
42-
isRootMenu,
4342
forceSubMenuRender,
4443
motion,
4544
defaultMotions,
@@ -91,9 +90,7 @@ export default defineComponent({
9190
rootClassName.value,
9291
)}
9392
stretch={mode === 'horizontal' ? 'minWidth' : null}
94-
getPopupContainer={
95-
isRootMenu.value ? getPopupContainer.value : triggerNode => triggerNode.parentNode
96-
}
93+
getPopupContainer={getPopupContainer.value}
9794
builtinPlacements={placement.value}
9895
popupPlacement={popupPlacement.value}
9996
popupVisible={innerVisible.value}

components/menu/src/SubMenu.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ export default defineComponent({
302302
onVisibleChange={onPopupVisibleChange}
303303
v-slots={{
304304
popup: () => (
305-
<MenuContextProvider mode={subMenuTriggerModeRef.value} isRootMenu={false}>
305+
<MenuContextProvider mode={subMenuTriggerModeRef.value}>
306306
<SubMenuList
307307
id={popupId}
308308
ref={popupRef}

components/menu/src/hooks/useMenuContext.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ export interface StoreMenuInfo {
1919
parentKeys: Ref<Key[]>;
2020
}
2121
export interface MenuContextProps {
22-
isRootMenu: Ref<boolean>;
2322
rootClassName: Ref<string>;
2423
registerMenuInfo: (key: string, info: StoreMenuInfo) => void;
2524
unRegisterMenuInfo: (key: string) => void;
@@ -114,7 +113,6 @@ const MenuContextProvider = defineComponent({
114113
props: {
115114
mode: { type: String as PropType<MenuMode>, default: undefined },
116115
overflowDisabled: { type: Boolean, default: undefined },
117-
isRootMenu: { type: Boolean, default: undefined },
118116
},
119117
setup(props, { slots }) {
120118
const menuContext = useInjectMenu();
@@ -124,9 +122,6 @@ const MenuContextProvider = defineComponent({
124122
if (props.mode !== undefined) {
125123
newContext.mode = toRef(props, 'mode');
126124
}
127-
if (props.isRootMenu !== undefined) {
128-
newContext.isRootMenu = toRef(props, 'isRootMenu');
129-
}
130125
if (props.overflowDisabled !== undefined) {
131126
newContext.overflowDisabled = toRef(props, 'overflowDisabled');
132127
}

components/vc-dropdown/Dropdown.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ export default defineComponent({
7070
const extraOverlayProps = {
7171
prefixCls: `${props.prefixCls}-menu`,
7272
onClick,
73-
getPopupContainer: () => triggerRef.value.getPopupDomNode(),
7473
};
7574
return (
7675
<Fragment key={skipFlattenKey}>

components/vc-trigger/Popup/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export default defineComponent({
1313
const innerVisible = shallowRef(false);
1414
const inMobile = shallowRef(false);
1515
const popupRef = shallowRef();
16+
const rootRef = shallowRef<HTMLElement>();
1617
watch(
1718
[() => props.visible, () => props.mobile],
1819
() => {
@@ -45,7 +46,7 @@ export default defineComponent({
4546
);
4647

4748
return (
48-
<div>
49+
<div ref={rootRef}>
4950
<Mask {...cloneProps} />
5051
{popupNode}
5152
</div>

components/vc-trigger/Trigger.tsx

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
getSlot,
1212
findDOMNode,
1313
} from '../_util/props-util';
14-
import { requestAnimationTimeout, cancelAnimationTimeout } from '../_util/requestAnimationTimeout';
1514
import addEventListener from '../vc-util/Dom/addEventListener';
1615
import Popup from './Popup';
1716
import { getAlignFromPlacement, getAlignPopupClassName } from './utils/alignUtil';
@@ -43,7 +42,6 @@ const ALL_HANDLERS = [
4342
'onBlur',
4443
'onContextmenu',
4544
];
46-
4745
export default defineComponent({
4846
compatConfig: { MODE: 3 },
4947
name: 'Trigger',
@@ -107,7 +105,11 @@ export default defineComponent({
107105
setPortal,
108106
vcTriggerContext: inject(
109107
'vcTriggerContext',
110-
{} as { onPopupMouseDown?: (...args: any[]) => void },
108+
{} as {
109+
onPopupMouseDown?: (...args: any[]) => void;
110+
onPopupMouseenter?: (...args: any[]) => void;
111+
onPopupMouseleave?: (...args: any[]) => void;
112+
},
111113
),
112114
popupRef,
113115
setPopupRef,
@@ -165,6 +167,8 @@ export default defineComponent({
165167
created() {
166168
provide('vcTriggerContext', {
167169
onPopupMouseDown: this.onPopupMouseDown,
170+
onPopupMouseenter: this.onPopupMouseenter,
171+
onPopupMouseleave: this.onPopupMouseleave,
168172
});
169173
useProvidePortal(this);
170174
},
@@ -256,6 +260,10 @@ export default defineComponent({
256260
},
257261

258262
onPopupMouseenter() {
263+
const { vcTriggerContext = {} } = this;
264+
if (vcTriggerContext.onPopupMouseenter) {
265+
vcTriggerContext.onPopupMouseenter();
266+
}
259267
this.clearDelayTimer();
260268
},
261269

@@ -269,6 +277,10 @@ export default defineComponent({
269277
return;
270278
}
271279
this.delaySetPopupVisible(false, this.$props.mouseLeaveDelay);
280+
const { vcTriggerContext = {} } = this;
281+
if (vcTriggerContext.onPopupMouseleave) {
282+
vcTriggerContext.onPopupMouseleave(e);
283+
}
272284
},
273285

274286
onFocus(e) {
@@ -359,7 +371,6 @@ export default defineComponent({
359371
this.mouseDownTimeout = setTimeout(() => {
360372
this.hasPopupMouseDown = false;
361373
}, 0);
362-
363374
if (vcTriggerContext.onPopupMouseDown) {
364375
vcTriggerContext.onPopupMouseDown(...args);
365376
}
@@ -574,7 +585,7 @@ export default defineComponent({
574585
this.clearDelayTimer();
575586
if (delay) {
576587
const point = event ? { pageX: event.pageX, pageY: event.pageY } : null;
577-
this.delayTimer = requestAnimationTimeout(() => {
588+
this.delayTimer = setTimeout(() => {
578589
this.setPopupVisible(visible, point);
579590
this.clearDelayTimer();
580591
}, delay);
@@ -585,7 +596,7 @@ export default defineComponent({
585596

586597
clearDelayTimer() {
587598
if (this.delayTimer) {
588-
cancelAnimationTimeout(this.delayTimer);
599+
clearTimeout(this.delayTimer);
589600
this.delayTimer = null;
590601
}
591602
},

0 commit comments

Comments
 (0)