fix: menu hide animate lose
parent
fcd6add766
commit
8e207009b0
|
@ -7,6 +7,7 @@ import { placements, placementsRtl } from './placements';
|
||||||
import type { RafFrame } from '../../_util/raf';
|
import type { RafFrame } from '../../_util/raf';
|
||||||
import raf from '../../_util/raf';
|
import raf from '../../_util/raf';
|
||||||
import classNames from '../../_util/classNames';
|
import classNames from '../../_util/classNames';
|
||||||
|
import { getTransitionProps } from '../../_util/transition';
|
||||||
|
|
||||||
const popupPlacementMap = {
|
const popupPlacementMap = {
|
||||||
horizontal: 'bottomLeft',
|
horizontal: 'bottomLeft',
|
||||||
|
@ -40,6 +41,9 @@ export default defineComponent({
|
||||||
triggerSubMenuAction,
|
triggerSubMenuAction,
|
||||||
isRootMenu,
|
isRootMenu,
|
||||||
forceSubMenuRender,
|
forceSubMenuRender,
|
||||||
|
motion,
|
||||||
|
defaultMotions,
|
||||||
|
mode,
|
||||||
} = useInjectMenu();
|
} = useInjectMenu();
|
||||||
const forceRender = useInjectForceRender();
|
const forceRender = useInjectForceRender();
|
||||||
const placement = computed(() =>
|
const placement = computed(() =>
|
||||||
|
@ -68,6 +72,13 @@ export default defineComponent({
|
||||||
const onVisibleChange = (visible: boolean) => {
|
const onVisibleChange = (visible: boolean) => {
|
||||||
emit('visibleChange', visible);
|
emit('visibleChange', visible);
|
||||||
};
|
};
|
||||||
|
const style = ref({});
|
||||||
|
const className = ref('');
|
||||||
|
const mergedMotion = computed(() => {
|
||||||
|
const m = motion.value || defaultMotions.value?.[mode.value] || defaultMotions.value?.other;
|
||||||
|
const res = typeof m === 'function' ? m(style, className) : m;
|
||||||
|
return res ? getTransitionProps(res.name, { css: true }) : undefined;
|
||||||
|
});
|
||||||
return () => {
|
return () => {
|
||||||
const { prefixCls, popupClassName, mode, popupOffset, disabled } = props;
|
const { prefixCls, popupClassName, mode, popupOffset, disabled } = props;
|
||||||
return (
|
return (
|
||||||
|
@ -93,6 +104,7 @@ export default defineComponent({
|
||||||
mouseLeaveDelay={subMenuCloseDelay.value}
|
mouseLeaveDelay={subMenuCloseDelay.value}
|
||||||
onPopupVisibleChange={onVisibleChange}
|
onPopupVisibleChange={onVisibleChange}
|
||||||
forceRender={forceRender || forceSubMenuRender.value}
|
forceRender={forceRender || forceSubMenuRender.value}
|
||||||
|
popupAnimation={mergedMotion.value}
|
||||||
v-slots={{
|
v-slots={{
|
||||||
popup: () => {
|
popup: () => {
|
||||||
return slots.popup?.({ visible: innerVisible.value });
|
return slots.popup?.({ visible: innerVisible.value });
|
||||||
|
|
|
@ -15,7 +15,6 @@ import useDirectionStyle from './hooks/useDirectionStyle';
|
||||||
import PopupTrigger from './PopupTrigger';
|
import PopupTrigger from './PopupTrigger';
|
||||||
import SubMenuList from './SubMenuList';
|
import SubMenuList from './SubMenuList';
|
||||||
import InlineSubMenuList from './InlineSubMenuList';
|
import InlineSubMenuList from './InlineSubMenuList';
|
||||||
import Transition, { getTransitionProps } from '../../_util/transition';
|
|
||||||
import { cloneElement } from '../../_util/vnode';
|
import { cloneElement } from '../../_util/vnode';
|
||||||
import Overflow from '../../vc-overflow';
|
import Overflow from '../../vc-overflow';
|
||||||
import devWarning from '../../vc-util/devWarning';
|
import devWarning from '../../vc-util/devWarning';
|
||||||
|
@ -93,8 +92,6 @@ export default defineComponent({
|
||||||
registerMenuInfo,
|
registerMenuInfo,
|
||||||
unRegisterMenuInfo,
|
unRegisterMenuInfo,
|
||||||
selectedSubMenuKeys,
|
selectedSubMenuKeys,
|
||||||
motion,
|
|
||||||
defaultMotions,
|
|
||||||
expandIcon: menuExpandIcon,
|
expandIcon: menuExpandIcon,
|
||||||
} = useInjectMenu();
|
} = useInjectMenu();
|
||||||
|
|
||||||
|
@ -230,14 +227,6 @@ export default defineComponent({
|
||||||
|
|
||||||
const renderMode = computed(() => (mode.value === 'horizontal' ? 'vertical' : mode.value));
|
const renderMode = computed(() => (mode.value === 'horizontal' ? 'vertical' : mode.value));
|
||||||
|
|
||||||
const style = ref({});
|
|
||||||
const className = ref('');
|
|
||||||
const mergedMotion = computed(() => {
|
|
||||||
const m = motion.value || defaultMotions.value?.[mode.value] || defaultMotions.value?.other;
|
|
||||||
const res = typeof m === 'function' ? m(style, className) : m;
|
|
||||||
return res ? getTransitionProps(res.name) : undefined;
|
|
||||||
});
|
|
||||||
|
|
||||||
const subMenuTriggerModeRef = computed(() =>
|
const subMenuTriggerModeRef = computed(() =>
|
||||||
triggerModeRef.value === 'horizontal' ? 'vertical' : triggerModeRef.value,
|
triggerModeRef.value === 'horizontal' ? 'vertical' : triggerModeRef.value,
|
||||||
);
|
);
|
||||||
|
@ -291,13 +280,11 @@ export default defineComponent({
|
||||||
disabled={mergedDisabled.value}
|
disabled={mergedDisabled.value}
|
||||||
onVisibleChange={onPopupVisibleChange}
|
onVisibleChange={onPopupVisibleChange}
|
||||||
v-slots={{
|
v-slots={{
|
||||||
popup: ({ visible }) => (
|
popup: () => (
|
||||||
<MenuContextProvider mode={subMenuTriggerModeRef.value} isRootMenu={false}>
|
<MenuContextProvider mode={subMenuTriggerModeRef.value} isRootMenu={false}>
|
||||||
<Transition {...mergedMotion.value}>
|
<SubMenuList id={popupId} ref={popupRef}>
|
||||||
<SubMenuList v-show={visible} id={popupId} ref={popupRef}>
|
{slots.default?.()}
|
||||||
{slots.default?.()}
|
</SubMenuList>
|
||||||
</SubMenuList>
|
|
||||||
</Transition>
|
|
||||||
</MenuContextProvider>
|
</MenuContextProvider>
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
|
|
|
@ -83,7 +83,7 @@ export default defineComponent({
|
||||||
|
|
||||||
// ======================== Motion ========================
|
// ======================== Motion ========================
|
||||||
const motion = computed(() => {
|
const motion = computed(() => {
|
||||||
const m = getMotion(props);
|
const m = typeof props.animation === 'object' ? props.animation : getMotion(props as any);
|
||||||
['onAfterEnter', 'onAfterLeave'].forEach(eventName => {
|
['onAfterEnter', 'onAfterLeave'].forEach(eventName => {
|
||||||
m[eventName] = () => {
|
m[eventName] = () => {
|
||||||
goNextStatus();
|
goNextStatus();
|
||||||
|
|
|
@ -11,7 +11,7 @@ export const innerProps = {
|
||||||
forceRender: Boolean,
|
forceRender: Boolean,
|
||||||
|
|
||||||
// Legacy Motion
|
// Legacy Motion
|
||||||
animation: String,
|
animation: [String, Object],
|
||||||
transitionName: String,
|
transitionName: String,
|
||||||
|
|
||||||
// Measure
|
// Measure
|
||||||
|
|
Loading…
Reference in New Issue