fix: menu hide animate lose

pull/5026/head
tangjinzhou 2021-12-10 00:02:12 +08:00
parent fcd6add766
commit 8e207009b0
4 changed files with 18 additions and 19 deletions

View File

@ -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 });

View File

@ -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>
), ),
}} }}

View File

@ -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();

View File

@ -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