refactor: menu

feat-new-menu
tangjinzhou 2021-05-18 23:39:47 +08:00
parent 0d318a324a
commit a887ec5b8f
2 changed files with 19 additions and 13 deletions

View File

@ -92,23 +92,20 @@ export declare type MotionEvent = (TransitionEvent | AnimationEvent) & {
};
export declare type MotionEventHandler = (
element: HTMLElement,
element: Element,
done?: () => void,
) => CSSProperties | void;
export declare type MotionEndEventHandler = (
element: HTMLElement,
done?: () => void,
) => boolean | void;
export declare type MotionEndEventHandler = (element: Element, done?: () => void) => boolean | void;
// ================== Collapse Motion ==================
const getCollapsedHeight: MotionEventHandler = () => ({ height: 0, opacity: 0 });
const getRealHeight: MotionEventHandler = node => ({ height: node.scrollHeight, opacity: 1 });
const getCurrentHeight: MotionEventHandler = node => ({ height: node.offsetHeight });
const getCurrentHeight: MotionEventHandler = (node: any) => ({ height: node.offsetHeight });
// const skipOpacityTransition: MotionEndEventHandler = (_, event) =>
// (event as TransitionEvent).propertyName === 'height';
export interface CSSMotionProps extends Partial<BaseTransitionProps<HTMLElement>> {
export interface CSSMotionProps extends Partial<BaseTransitionProps<Element>> {
name?: string;
css?: boolean;
}
@ -116,7 +113,6 @@ export interface CSSMotionProps extends Partial<BaseTransitionProps<HTMLElement>
const collapseMotion: CSSMotionProps = {
name: 'ant-motion-collapse',
appear: true,
css: false,
// onAppearStart: getCollapsedHeight,
onBeforeEnter: getCollapsedHeight,
onEnter: getRealHeight,

View File

@ -1,7 +1,9 @@
import { computed, defineComponent, ref, watch } from '@vue/runtime-core';
import Transition from 'ant-design-vue/es/_util/transition';
import { useInjectMenu, MenuContextProvider } from './hooks/useMenuContext';
import { MenuMode } from './interface';
import SubMenuList from './SubMenuList';
export default defineComponent({
name: 'InlineSubMenuList',
inheritAttrs: false,
@ -12,10 +14,12 @@ export default defineComponent({
},
setup(props, { slots }) {
const fixedMode: MenuMode = 'inline';
const { prefixCls, forceSubMenuRender, motion, mode } = useInjectMenu();
const { prefixCls, forceSubMenuRender, motion, mode, defaultMotions } = useInjectMenu();
const sameModeRef = computed(() => mode.value === fixedMode);
const destroy = ref(!sameModeRef.value);
const mergedOpen = computed(() => (sameModeRef.value ? props.open : false));
// ================================= Effect =================================
// Reset destroy state when mode change back
watch(
@ -27,9 +31,11 @@ export default defineComponent({
},
{ flush: 'post' },
);
let transitionProps = computed(() => {
return { appear: props.keyPath.length > 1, css: false };
});
const mergedMotion = computed(() => ({
...(motion.value || defaultMotions.value?.[fixedMode]),
appear: props.keyPath.length <= 1,
}));
return () => {
if (destroy.value) {
@ -42,7 +48,11 @@ export default defineComponent({
locked: !sameModeRef.value,
}}
>
<SubMenuList id={props.id}>{slots.default?.()}</SubMenuList>
<Transition {...mergedMotion.value}>
<SubMenuList v-show={mergedOpen.value} id={props.id}>
{slots.default?.()}
</SubMenuList>
</Transition>
</MenuContextProvider>
);
};