|
@@ -1,5 +1,5 @@
|
|
|
<script setup lang="ts">
|
|
|
-import { computed } from 'vue';
|
|
|
+import { computed, ref } from 'vue';
|
|
|
|
|
|
import { cn } from '@vben-core/shared/utils';
|
|
|
|
|
@@ -32,7 +32,9 @@ const props = withDefaults(defineProps<SheetContentProps>(), {
|
|
|
zIndex: 1000,
|
|
|
});
|
|
|
|
|
|
-const emits = defineEmits<DialogContentEmits>();
|
|
|
+const emits = defineEmits<
|
|
|
+ { close: []; closed: []; opened: [] } & DialogContentEmits
|
|
|
+>();
|
|
|
|
|
|
const delegatedProps = computed(() => {
|
|
|
const {
|
|
@@ -59,6 +61,17 @@ const position = computed(() => {
|
|
|
});
|
|
|
|
|
|
const forwarded = useForwardPropsEmits(delegatedProps, emits);
|
|
|
+const contentRef = ref<InstanceType<typeof DialogContent> | null>(null);
|
|
|
+function onAnimationEnd(event: AnimationEvent) {
|
|
|
+ // 只有在 contentRef 的动画结束时才触发 opened/closed 事件
|
|
|
+ if (event.target === contentRef.value?.$el) {
|
|
|
+ if (props.open) {
|
|
|
+ emits('opened');
|
|
|
+ } else {
|
|
|
+ emits('closed');
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
</script>
|
|
|
|
|
|
<template>
|
|
@@ -67,8 +80,10 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
|
|
|
<SheetOverlay v-if="open && modal" :style="{ zIndex, position }" />
|
|
|
</Transition>
|
|
|
<DialogContent
|
|
|
+ ref="contentRef"
|
|
|
:class="cn(sheetVariants({ side }), props.class)"
|
|
|
:style="{ zIndex, position }"
|
|
|
+ @animationend="onAnimationEnd"
|
|
|
v-bind="{ ...forwarded, ...$attrs }"
|
|
|
>
|
|
|
<slot></slot>
|