mirror of
https://github.com/vbenjs/vue-vben-admin.git
synced 2025-02-02 18:28:40 +08:00
feat: drawer support destroy on close
This commit is contained in:
parent
e86a7906fe
commit
de17007788
@ -126,9 +126,13 @@ export type ExtendedDrawerApi = {
|
|||||||
|
|
||||||
export interface DrawerApiOptions extends DrawerState {
|
export interface DrawerApiOptions extends DrawerState {
|
||||||
/**
|
/**
|
||||||
* 独立的弹窗组件
|
* 独立的抽屉组件
|
||||||
*/
|
*/
|
||||||
connectedComponent?: Component;
|
connectedComponent?: Component;
|
||||||
|
/**
|
||||||
|
* 在关闭时销毁抽屉。仅在使用 connectedComponent 时有效
|
||||||
|
*/
|
||||||
|
destroyOnClose?: boolean;
|
||||||
/**
|
/**
|
||||||
* 关闭前的回调,返回 false 可以阻止关闭
|
* 关闭前的回调,返回 false 可以阻止关闭
|
||||||
* @returns
|
* @returns
|
||||||
|
@ -4,7 +4,15 @@ import type {
|
|||||||
ExtendedDrawerApi,
|
ExtendedDrawerApi,
|
||||||
} from './drawer';
|
} 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';
|
import { useStore } from '@vben-core/shared/store';
|
||||||
|
|
||||||
@ -22,6 +30,7 @@ export function useVbenDrawer<
|
|||||||
const { connectedComponent } = options;
|
const { connectedComponent } = options;
|
||||||
if (connectedComponent) {
|
if (connectedComponent) {
|
||||||
const extendedApi = reactive({});
|
const extendedApi = reactive({});
|
||||||
|
const isDrawerReady = ref(true);
|
||||||
const Drawer = defineComponent(
|
const Drawer = defineComponent(
|
||||||
(props: TParentDrawerProps, { attrs, slots }) => {
|
(props: TParentDrawerProps, { attrs, slots }) => {
|
||||||
provide(USER_DRAWER_INJECT_KEY, {
|
provide(USER_DRAWER_INJECT_KEY, {
|
||||||
@ -31,13 +40,23 @@ export function useVbenDrawer<
|
|||||||
Object.setPrototypeOf(extendedApi, api);
|
Object.setPrototypeOf(extendedApi, api);
|
||||||
},
|
},
|
||||||
options,
|
options,
|
||||||
|
async reCreateDrawer() {
|
||||||
|
isDrawerReady.value = false;
|
||||||
|
await nextTick();
|
||||||
|
isDrawerReady.value = true;
|
||||||
|
},
|
||||||
});
|
});
|
||||||
checkProps(extendedApi as ExtendedDrawerApi, {
|
checkProps(extendedApi as ExtendedDrawerApi, {
|
||||||
...props,
|
...props,
|
||||||
...attrs,
|
...attrs,
|
||||||
...slots,
|
...slots,
|
||||||
});
|
});
|
||||||
return () => h(connectedComponent, { ...props, ...attrs }, slots);
|
return () =>
|
||||||
|
h(
|
||||||
|
isDrawerReady.value ? connectedComponent : 'div',
|
||||||
|
{ ...props, ...attrs },
|
||||||
|
slots,
|
||||||
|
);
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
inheritAttrs: false,
|
inheritAttrs: false,
|
||||||
@ -58,6 +77,14 @@ export function useVbenDrawer<
|
|||||||
options.onOpenChange?.(isOpen);
|
options.onOpenChange?.(isOpen);
|
||||||
injectData.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 api = new DrawerApi(mergedOptions);
|
||||||
|
|
||||||
const extendedApi: ExtendedDrawerApi = api as never;
|
const extendedApi: ExtendedDrawerApi = api as never;
|
||||||
|
@ -77,9 +77,11 @@ export function useVbenModal<TParentModalProps extends ModalProps = ModalProps>(
|
|||||||
injectData.options?.onOpenChange?.(isOpen);
|
injectData.options?.onOpenChange?.(isOpen);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const onClosed = mergedOptions.onClosed;
|
||||||
|
|
||||||
mergedOptions.onClosed = () => {
|
mergedOptions.onClosed = () => {
|
||||||
options.onClosed?.();
|
onClosed?.();
|
||||||
if (options.destroyOnClose) {
|
if (mergedOptions.destroyOnClose) {
|
||||||
injectData.reCreateModal?.();
|
injectData.reCreateModal?.();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user