1
1
<script lang="ts" setup>
2
2
import type { ExtendedModalApi , ModalProps } from ' ./modal' ;
3
3
4
- import { computed , nextTick , provide , ref , useId , watch } from ' vue' ;
4
+ import { computed , nextTick , provide , ref , unref , useId , watch } from ' vue' ;
5
5
6
6
import {
7
7
useIsMobile ,
@@ -34,6 +34,7 @@ interface Props extends ModalProps {
34
34
35
35
const props = withDefaults (defineProps <Props >(), {
36
36
appendToMain: false ,
37
+ destroyOnClose: true ,
37
38
modalApi: undefined ,
38
39
});
39
40
@@ -67,6 +68,7 @@ const {
67
68
confirmText,
68
69
contentClass,
69
70
description,
71
+ destroyOnClose,
70
72
draggable,
71
73
footer : showFooter,
72
74
footerClass,
@@ -100,10 +102,15 @@ const { dragging, transform } = useModalDraggable(
100
102
shouldDraggable ,
101
103
);
102
104
105
+ const firstOpened = ref (false );
106
+ const isClosed = ref (false );
107
+
103
108
watch (
104
109
() => state ?.value ?.isOpen ,
105
110
async (v ) => {
106
111
if (v ) {
112
+ isClosed .value = false ;
113
+ if (! firstOpened .value ) firstOpened .value = true ;
107
114
await nextTick ();
108
115
if (! contentRef .value ) return ;
109
116
const innerContentRef = contentRef .value .getContentRef ();
@@ -113,6 +120,7 @@ watch(
113
120
dialogRef .value .style .transform = ` translate(${offsetX }px, ${offsetY }px) ` ;
114
121
}
115
122
},
123
+ { immediate: true },
116
124
);
117
125
118
126
watch (
@@ -176,6 +184,15 @@ const getAppendTo = computed(() => {
176
184
? ` #${ELEMENT_ID_MAIN_CONTENT }>div:not(.absolute)>div `
177
185
: undefined ;
178
186
});
187
+
188
+ const getForceMount = computed (() => {
189
+ return ! unref (destroyOnClose );
190
+ });
191
+
192
+ function handleClosed() {
193
+ isClosed .value = true ;
194
+ props .modalApi ?.onClosed ();
195
+ }
179
196
</script >
180
197
<template >
181
198
<Dialog
@@ -197,17 +214,19 @@ const getAppendTo = computed(() => {
197
214
shouldFullscreen,
198
215
'top-1/2 !-translate-y-1/2': centered && !shouldFullscreen,
199
216
'duration-300': !dragging,
217
+ hidden: isClosed,
200
218
},
201
219
)
202
220
"
221
+ :force-mount =" getForceMount"
203
222
:modal =" modal"
204
223
:open =" state?.isOpen"
205
224
:show-close =" closable"
206
225
:z-index =" zIndex"
207
226
:overlay-blur =" overlayBlur"
208
227
close-class =" top-3"
209
228
@close-auto-focus =" handleFocusOutside"
210
- @closed =" () => modalApi?.onClosed() "
229
+ @closed =" handleClosed "
211
230
:close-disabled =" submitting"
212
231
@escape-key-down =" escapeKeyDown"
213
232
@focus-outside =" handleFocusOutside"
0 commit comments