|
@@ -4,7 +4,15 @@ import type {
|
|
|
ExtendedDrawerApi,
|
|
|
} from './drawer';
|
|
|
|
|
|
-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';
|
|
|
|
|
@@ -22,6 +30,7 @@ export function useVbenDrawer<
|
|
|
const { connectedComponent } = options;
|
|
|
if (connectedComponent) {
|
|
|
const extendedApi = reactive({});
|
|
|
+ const isDrawerReady = ref(true);
|
|
|
const Drawer = defineComponent(
|
|
|
(props: TParentDrawerProps, { attrs, slots }) => {
|
|
|
provide(USER_DRAWER_INJECT_KEY, {
|
|
@@ -31,13 +40,23 @@ export function useVbenDrawer<
|
|
|
Object.setPrototypeOf(extendedApi, api);
|
|
|
},
|
|
|
options,
|
|
|
+ async reCreateDrawer() {
|
|
|
+ isDrawerReady.value = false;
|
|
|
+ await nextTick();
|
|
|
+ isDrawerReady.value = true;
|
|
|
+ },
|
|
|
});
|
|
|
checkProps(extendedApi as ExtendedDrawerApi, {
|
|
|
...props,
|
|
|
...attrs,
|
|
|
...slots,
|
|
|
});
|
|
|
- return () => h(connectedComponent, { ...props, ...attrs }, slots);
|
|
|
+ return () =>
|
|
|
+ h(
|
|
|
+ isDrawerReady.value ? connectedComponent : 'div',
|
|
|
+ { ...props, ...attrs },
|
|
|
+ slots,
|
|
|
+ );
|
|
|
},
|
|
|
{
|
|
|
inheritAttrs: false,
|
|
@@ -58,6 +77,14 @@ export function useVbenDrawer<
|
|
|
options.onOpenChange?.(isOpen);
|
|
|
injectData.options?.onOpenChange?.(isOpen);
|
|
|
};
|
|
|
+
|
|
|
+ const onClosed = mergedOptions.onClosed;
|
|
|
+ mergedOptions.onClosed = () => {
|
|
|
+ onClosed?.();
|
|
|
+ if (mergedOptions.destroyOnClose) {
|
|
|
+ injectData.reCreateDrawer?.();
|
|
|
+ }
|
|
|
+ };
|
|
|
const api = new DrawerApi(mergedOptions);
|
|
|
|
|
|
const extendedApi: ExtendedDrawerApi = api as never;
|