From 1156a4f4e209bde9af2d8dda122733c9fde3ecb2 Mon Sep 17 00:00:00 2001 From: sallerli1 Date: Fri, 26 Jan 2024 16:39:00 +0800 Subject: [PATCH] fix(comp:drawer): destroyOnHide drawer doesn't destroy if visible is set false before enter transition --- packages/components/drawer/src/Drawer.tsx | 22 +++++++++---------- .../components/drawer/src/DrawerWrapper.tsx | 6 ++++- packages/components/drawer/src/token.ts | 3 ++- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/packages/components/drawer/src/Drawer.tsx b/packages/components/drawer/src/Drawer.tsx index 80c7fc649..0c44d0b87 100644 --- a/packages/components/drawer/src/Drawer.tsx +++ b/packages/components/drawer/src/Drawer.tsx @@ -51,7 +51,8 @@ export default defineComponent({ const mask = computed(() => props.mask ?? config.mask) const mergedDistance = computed(() => props.distance ?? config.distance) - const { loaded, delayedLoaded, visible, setVisible, animatedVisible, mergedVisible } = useVisible(props) + const { loaded, delayedLoaded, visible, setVisible, animatedVisible, isAnimating, mergedVisible } = + useVisible(props) const currentZIndex = useZIndex(toRef(props, 'zIndex'), toRef(common, 'overlayZIndex'), visible) const drawerElRef = ref() @@ -69,6 +70,7 @@ export default defineComponent({ visible, delayedLoaded, animatedVisible, + isAnimating, mergedVisible, currentZIndex, levelAction, @@ -110,6 +112,9 @@ function useVisible(props: DrawerProps) { const loaded = ref(false) const delayedLoaded = ref(false) const delayedVisible = ref(false) + const isAnimating = ref(false) + const animatedVisible = ref(false) + watch( visible, v => { @@ -123,22 +128,15 @@ function useVisible(props: DrawerProps) { } else { delayedVisible.value = v } + + isAnimating.value = true }, { immediate: true, }, ) - const animatedVisible = ref() - - const mergedVisible = computed(() => { - const currVisible = visible.value - const currAnimatedVisible = animatedVisible.value - if (currAnimatedVisible === undefined || currVisible) { - return currVisible - } - return currAnimatedVisible - }) + const mergedVisible = computed(() => visible.value || (isAnimating.value ? animatedVisible.value : visible.value)) onDeactivated(() => { if (mergedVisible.value && props.closeOnDeactivated) { @@ -146,7 +144,7 @@ function useVisible(props: DrawerProps) { } }) - return { loaded, delayedLoaded, visible: delayedVisible, setVisible, animatedVisible, mergedVisible } + return { loaded, delayedLoaded, visible: delayedVisible, setVisible, animatedVisible, isAnimating, mergedVisible } } function useScrollStrategy(props: DrawerProps, mask: ComputedRef, mergedVisible: ComputedRef) { diff --git a/packages/components/drawer/src/DrawerWrapper.tsx b/packages/components/drawer/src/DrawerWrapper.tsx index d0ed4f759..48ec9c86e 100644 --- a/packages/components/drawer/src/DrawerWrapper.tsx +++ b/packages/components/drawer/src/DrawerWrapper.tsx @@ -52,6 +52,7 @@ export default defineComponent({ visible, delayedLoaded, animatedVisible, + isAnimating, mergedVisible, currentZIndex, levelAction, @@ -130,7 +131,7 @@ export default defineComponent({ sentinelEndRef, ) - const { onEnter, onAfterEnter, onAfterLeave } = useEvents(props, wrapperRef, animatedVisible) + const { onEnter, onAfterEnter, onAfterLeave } = useEvents(props, wrapperRef, animatedVisible, isAnimating) onMounted(() => { watchVisibleChange(props, wrapperRef, sentinelStartRef, mask) @@ -292,6 +293,7 @@ function useEvents( props: DrawerProps, wrapperRef: Ref, animatedVisible: Ref, + isAnimating: Ref, ) { let lastOutSideActiveElement: HTMLElement | null = null const onEnter = () => { @@ -311,6 +313,7 @@ function useEvents( callEmit(props.onAfterOpen) animatedVisible.value = true + isAnimating.value = false } const onAfterLeave = () => { @@ -330,6 +333,7 @@ function useEvents( callEmit(props.onAfterClose) animatedVisible.value = false + isAnimating.value = false } return { onEnter, onAfterEnter, onAfterLeave } } diff --git a/packages/components/drawer/src/token.ts b/packages/components/drawer/src/token.ts index a5ee10b5a..c642a5b1c 100644 --- a/packages/components/drawer/src/token.ts +++ b/packages/components/drawer/src/token.ts @@ -18,7 +18,8 @@ export interface DrawerContext { drawerElRef: Ref visible: Ref delayedLoaded: Ref - animatedVisible: Ref + animatedVisible: Ref + isAnimating: Ref mergedVisible: ComputedRef currentZIndex: ComputedRef levelAction: Ref<'push' | 'pull' | undefined>