fix: dropdown menu hide error
parent
98be7071e5
commit
61d6312783
|
@ -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,
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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');
|
||||||
}
|
}
|
||||||
|
|
|
@ -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}>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue