From 4a8e6abc06c4b2b89349e20138cf73c145262b8f Mon Sep 17 00:00:00 2001 From: Netfan Date: Mon, 30 Dec 2024 20:26:15 +0800 Subject: [PATCH] feat: modal support destroy on close --- .../@core/ui-kit/popup-ui/src/modal/modal.ts | 4 +++ .../ui-kit/popup-ui/src/modal/use-modal.ts | 25 +++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/packages/@core/ui-kit/popup-ui/src/modal/modal.ts b/packages/@core/ui-kit/popup-ui/src/modal/modal.ts index 5508d004b..ea761e439 100644 --- a/packages/@core/ui-kit/popup-ui/src/modal/modal.ts +++ b/packages/@core/ui-kit/popup-ui/src/modal/modal.ts @@ -143,6 +143,10 @@ export interface ModalApiOptions extends ModalState { * 独立的弹窗组件 */ connectedComponent?: Component; + /** + * 在关闭时销毁弹窗。仅在使用 connectedComponent 时有效 + */ + destroyOnClose?: boolean; /** * 关闭前的回调,返回 false 可以阻止关闭 * @returns diff --git a/packages/@core/ui-kit/popup-ui/src/modal/use-modal.ts b/packages/@core/ui-kit/popup-ui/src/modal/use-modal.ts index f972530de..362a6f056 100644 --- a/packages/@core/ui-kit/popup-ui/src/modal/use-modal.ts +++ b/packages/@core/ui-kit/popup-ui/src/modal/use-modal.ts @@ -1,6 +1,14 @@ import type { ExtendedModalApi, ModalApiOptions, ModalProps } from './modal'; -import { defineComponent, h, inject, nextTick, provide, reactive } from 'vue'; +import { + defineComponent, + h, + inject, + nextTick, + provide, + reactive, + ref, +} from 'vue'; import { useStore } from '@vben-core/shared/store'; @@ -18,6 +26,7 @@ export function useVbenModal( const { connectedComponent } = options; if (connectedComponent) { const extendedApi = reactive({}); + const isModalReady = ref(true); const Modal = defineComponent( (props: TParentModalProps, { attrs, slots }) => { provide(USER_MODAL_INJECT_KEY, { @@ -27,6 +36,11 @@ export function useVbenModal( Object.setPrototypeOf(extendedApi, api); }, options, + async reCreateModal() { + isModalReady.value = false; + await nextTick(); + isModalReady.value = true; + }, }); checkProps(extendedApi as ExtendedModalApi, { ...props, @@ -35,7 +49,7 @@ export function useVbenModal( }); return () => h( - connectedComponent, + isModalReady.value ? connectedComponent : 'div', { ...props, ...attrs, @@ -62,6 +76,13 @@ export function useVbenModal( options.onOpenChange?.(isOpen); injectData.options?.onOpenChange?.(isOpen); }; + + mergedOptions.onClosed = () => { + options.onClosed?.(); + if (options.destroyOnClose) { + injectData.reCreateModal?.(); + } + }; const api = new ModalApi(mergedOptions); const extendedApi: ExtendedModalApi = api as never;