fix: dropdown menu hide error

pull/6527/head
tangjinzhou 2023-05-02 23:36:12 +08:00
parent 98be7071e5
commit 61d6312783
7 changed files with 50 additions and 49 deletions

View File

@ -65,7 +65,7 @@ export const menuProps = () => ({
mode: { type: String as PropType<MenuMode>, default: 'vertical' }, mode: { type: String as PropType<MenuMode>, default: 'vertical' },
inlineIndent: { type: Number, default: 24 }, inlineIndent: { type: Number, default: 24 },
subMenuOpenDelay: { type: Number, default: 0.1 }, subMenuOpenDelay: { type: Number, default: 0 },
subMenuCloseDelay: { type: Number, default: 0.1 }, subMenuCloseDelay: { type: Number, default: 0.1 },
builtinPlacements: { type: Object as PropType<BuiltinPlacements> }, builtinPlacements: { type: Object as PropType<BuiltinPlacements> },
@ -201,9 +201,7 @@ export default defineComponent({
// >>>>> Trigger select // >>>>> Trigger select
const triggerSelection = (info: MenuInfo) => { const triggerSelection = (info: MenuInfo) => {
if (!props.selectable) { if (props.selectable) {
return;
}
// Insert or Remove // Insert or Remove
const { key: targetKey } = info; const { key: targetKey } = info;
const exist = mergedSelectedKeys.value.includes(targetKey); const exist = mergedSelectedKeys.value.includes(targetKey);
@ -235,7 +233,8 @@ export default defineComponent({
emit('select', selectInfo); emit('select', selectInfo);
} }
} }
}
// Whatever selectable, always close it
if (mergedMode.value !== 'inline' && !props.multiple && mergedOpenKeys.value.length) { if (mergedMode.value !== 'inline' && !props.multiple && mergedOpenKeys.value.length) {
triggerOpenKeys(EMPTY_LIST); triggerOpenKeys(EMPTY_LIST);
} }
@ -432,7 +431,6 @@ export default defineComponent({
registerMenuInfo, registerMenuInfo,
unRegisterMenuInfo, unRegisterMenuInfo,
selectedSubMenuKeys, selectedSubMenuKeys,
isRootMenu: shallowRef(true),
expandIcon, expandIcon,
forceSubMenuRender: computed(() => props.forceSubMenuRender), forceSubMenuRender: computed(() => props.forceSubMenuRender),
rootClassName: hashId, rootClassName: hashId,

View File

@ -39,7 +39,6 @@ export default defineComponent({
subMenuCloseDelay, subMenuCloseDelay,
builtinPlacements, builtinPlacements,
triggerSubMenuAction, triggerSubMenuAction,
isRootMenu,
forceSubMenuRender, forceSubMenuRender,
motion, motion,
defaultMotions, defaultMotions,
@ -91,9 +90,7 @@ export default defineComponent({
rootClassName.value, rootClassName.value,
)} )}
stretch={mode === 'horizontal' ? 'minWidth' : null} stretch={mode === 'horizontal' ? 'minWidth' : null}
getPopupContainer={ getPopupContainer={getPopupContainer.value}
isRootMenu.value ? getPopupContainer.value : triggerNode => triggerNode.parentNode
}
builtinPlacements={placement.value} builtinPlacements={placement.value}
popupPlacement={popupPlacement.value} popupPlacement={popupPlacement.value}
popupVisible={innerVisible.value} popupVisible={innerVisible.value}

View File

@ -302,7 +302,7 @@ export default defineComponent({
onVisibleChange={onPopupVisibleChange} onVisibleChange={onPopupVisibleChange}
v-slots={{ v-slots={{
popup: () => ( popup: () => (
<MenuContextProvider mode={subMenuTriggerModeRef.value} isRootMenu={false}> <MenuContextProvider mode={subMenuTriggerModeRef.value}>
<SubMenuList <SubMenuList
id={popupId} id={popupId}
ref={popupRef} ref={popupRef}

View File

@ -19,7 +19,6 @@ export interface StoreMenuInfo {
parentKeys: Ref<Key[]>; parentKeys: Ref<Key[]>;
} }
export interface MenuContextProps { export interface MenuContextProps {
isRootMenu: Ref<boolean>;
rootClassName: Ref<string>; rootClassName: Ref<string>;
registerMenuInfo: (key: string, info: StoreMenuInfo) => void; registerMenuInfo: (key: string, info: StoreMenuInfo) => void;
unRegisterMenuInfo: (key: string) => void; unRegisterMenuInfo: (key: string) => void;
@ -114,7 +113,6 @@ const MenuContextProvider = defineComponent({
props: { props: {
mode: { type: String as PropType<MenuMode>, default: undefined }, mode: { type: String as PropType<MenuMode>, default: undefined },
overflowDisabled: { type: Boolean, default: undefined }, overflowDisabled: { type: Boolean, default: undefined },
isRootMenu: { type: Boolean, default: undefined },
}, },
setup(props, { slots }) { setup(props, { slots }) {
const menuContext = useInjectMenu(); const menuContext = useInjectMenu();
@ -124,9 +122,6 @@ const MenuContextProvider = defineComponent({
if (props.mode !== undefined) { if (props.mode !== undefined) {
newContext.mode = toRef(props, 'mode'); newContext.mode = toRef(props, 'mode');
} }
if (props.isRootMenu !== undefined) {
newContext.isRootMenu = toRef(props, 'isRootMenu');
}
if (props.overflowDisabled !== undefined) { if (props.overflowDisabled !== undefined) {
newContext.overflowDisabled = toRef(props, 'overflowDisabled'); newContext.overflowDisabled = toRef(props, 'overflowDisabled');
} }

View File

@ -70,7 +70,6 @@ export default defineComponent({
const extraOverlayProps = { const extraOverlayProps = {
prefixCls: `${props.prefixCls}-menu`, prefixCls: `${props.prefixCls}-menu`,
onClick, onClick,
getPopupContainer: () => triggerRef.value.getPopupDomNode(),
}; };
return ( return (
<Fragment key={skipFlattenKey}> <Fragment key={skipFlattenKey}>

View File

@ -13,6 +13,7 @@ export default defineComponent({
const innerVisible = shallowRef(false); const innerVisible = shallowRef(false);
const inMobile = shallowRef(false); const inMobile = shallowRef(false);
const popupRef = shallowRef(); const popupRef = shallowRef();
const rootRef = shallowRef<HTMLElement>();
watch( watch(
[() => props.visible, () => props.mobile], [() => props.visible, () => props.mobile],
() => { () => {
@ -45,7 +46,7 @@ export default defineComponent({
); );
return ( return (
<div> <div ref={rootRef}>
<Mask {...cloneProps} /> <Mask {...cloneProps} />
{popupNode} {popupNode}
</div> </div>

View File

@ -11,7 +11,6 @@ import {
getSlot, getSlot,
findDOMNode, findDOMNode,
} from '../_util/props-util'; } from '../_util/props-util';
import { requestAnimationTimeout, cancelAnimationTimeout } from '../_util/requestAnimationTimeout';
import addEventListener from '../vc-util/Dom/addEventListener'; import addEventListener from '../vc-util/Dom/addEventListener';
import Popup from './Popup'; import Popup from './Popup';
import { getAlignFromPlacement, getAlignPopupClassName } from './utils/alignUtil'; import { getAlignFromPlacement, getAlignPopupClassName } from './utils/alignUtil';
@ -43,7 +42,6 @@ const ALL_HANDLERS = [
'onBlur', 'onBlur',
'onContextmenu', 'onContextmenu',
]; ];
export default defineComponent({ export default defineComponent({
compatConfig: { MODE: 3 }, compatConfig: { MODE: 3 },
name: 'Trigger', name: 'Trigger',
@ -107,7 +105,11 @@ export default defineComponent({
setPortal, setPortal,
vcTriggerContext: inject( vcTriggerContext: inject(
'vcTriggerContext', 'vcTriggerContext',
{} as { onPopupMouseDown?: (...args: any[]) => void }, {} as {
onPopupMouseDown?: (...args: any[]) => void;
onPopupMouseenter?: (...args: any[]) => void;
onPopupMouseleave?: (...args: any[]) => void;
},
), ),
popupRef, popupRef,
setPopupRef, setPopupRef,
@ -165,6 +167,8 @@ export default defineComponent({
created() { created() {
provide('vcTriggerContext', { provide('vcTriggerContext', {
onPopupMouseDown: this.onPopupMouseDown, onPopupMouseDown: this.onPopupMouseDown,
onPopupMouseenter: this.onPopupMouseenter,
onPopupMouseleave: this.onPopupMouseleave,
}); });
useProvidePortal(this); useProvidePortal(this);
}, },
@ -256,6 +260,10 @@ export default defineComponent({
}, },
onPopupMouseenter() { onPopupMouseenter() {
const { vcTriggerContext = {} } = this;
if (vcTriggerContext.onPopupMouseenter) {
vcTriggerContext.onPopupMouseenter();
}
this.clearDelayTimer(); this.clearDelayTimer();
}, },
@ -269,6 +277,10 @@ export default defineComponent({
return; return;
} }
this.delaySetPopupVisible(false, this.$props.mouseLeaveDelay); this.delaySetPopupVisible(false, this.$props.mouseLeaveDelay);
const { vcTriggerContext = {} } = this;
if (vcTriggerContext.onPopupMouseleave) {
vcTriggerContext.onPopupMouseleave(e);
}
}, },
onFocus(e) { onFocus(e) {
@ -359,7 +371,6 @@ export default defineComponent({
this.mouseDownTimeout = setTimeout(() => { this.mouseDownTimeout = setTimeout(() => {
this.hasPopupMouseDown = false; this.hasPopupMouseDown = false;
}, 0); }, 0);
if (vcTriggerContext.onPopupMouseDown) { if (vcTriggerContext.onPopupMouseDown) {
vcTriggerContext.onPopupMouseDown(...args); vcTriggerContext.onPopupMouseDown(...args);
} }
@ -574,7 +585,7 @@ export default defineComponent({
this.clearDelayTimer(); this.clearDelayTimer();
if (delay) { if (delay) {
const point = event ? { pageX: event.pageX, pageY: event.pageY } : null; const point = event ? { pageX: event.pageX, pageY: event.pageY } : null;
this.delayTimer = requestAnimationTimeout(() => { this.delayTimer = setTimeout(() => {
this.setPopupVisible(visible, point); this.setPopupVisible(visible, point);
this.clearDelayTimer(); this.clearDelayTimer();
}, delay); }, delay);
@ -585,7 +596,7 @@ export default defineComponent({
clearDelayTimer() { clearDelayTimer() {
if (this.delayTimer) { if (this.delayTimer) {
cancelAnimationTimeout(this.delayTimer); clearTimeout(this.delayTimer);
this.delayTimer = null; this.delayTimer = null;
} }
}, },