Skip to content

Commit 14bd6dd

Browse files
authored
fix: destroyOnClose works within connectedComponent (#5989)
* 修复destroyOnClose没能销毁connectedComponent自身的问题
1 parent 7f269e0 commit 14bd6dd

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

docs/src/components/common-ui/vben-modal.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ Modal 内的内容一般业务中,会比较复杂,所以我们可以将 moda
5959
::: info 注意
6060

6161
- `VbenModal` 组件对与参数的处理优先级是 `slot` > `props` > `state`(通过api更新的状态以及useVbenModal参数)。如果你已经传入了 `slot` 或者 `props`,那么 `setState` 将不会生效,这种情况下你可以通过 `slot` 或者 `props` 来更新状态。
62-
- 如果你使用到了 `connectedComponent` 参数,那么会存在 2 个`useVbenModal`, 此时,如果同时设置了相同的参数,那么以内部为准(也就是没有设置 connectedComponent 的代码)。比如 同时设置了 `onConfirm`,那么以内部的 `onConfirm` 为准。`onOpenChange`事件除外,内外都会触发。
62+
- 如果你使用到了 `connectedComponent` 参数,那么会存在 2 个`useVbenModal`, 此时,如果同时设置了相同的参数,那么以内部为准(也就是没有设置 connectedComponent 的代码)。比如 同时设置了 `onConfirm`,那么以内部的 `onConfirm` 为准。`onOpenChange`事件除外,内外都会触发。另外,如果设置了`destroyOnClose`,内部Modal及其子组件会在被关闭后<b>完全销毁</b>。
6363
- 如果弹窗的默认行为不符合你的预期,可以在`src\bootstrap.ts`中修改`setDefaultModalProps`的参数来设置默认的属性,如默认隐藏全屏按钮,修改默认ZIndex等。
6464

6565
:::

packages/@core/ui-kit/popup-ui/src/modal/use-modal.ts

+23-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
import type { ExtendedModalApi, ModalApiOptions, ModalProps } from './modal';
22

3-
import { defineComponent, h, inject, nextTick, provide, reactive } from 'vue';
3+
import {
4+
defineComponent,
5+
h,
6+
inject,
7+
nextTick,
8+
provide,
9+
reactive,
10+
ref,
11+
} from 'vue';
412

513
import { useStore } from '@vben-core/shared/store';
614

@@ -24,6 +32,7 @@ export function useVbenModal<TParentModalProps extends ModalProps = ModalProps>(
2432
const { connectedComponent } = options;
2533
if (connectedComponent) {
2634
const extendedApi = reactive({});
35+
const isModalReady = ref(true);
2736
const Modal = defineComponent(
2837
(props: TParentModalProps, { attrs, slots }) => {
2938
provide(USER_MODAL_INJECT_KEY, {
@@ -33,6 +42,11 @@ export function useVbenModal<TParentModalProps extends ModalProps = ModalProps>(
3342
Object.setPrototypeOf(extendedApi, api);
3443
},
3544
options,
45+
async reCreateModal() {
46+
isModalReady.value = false;
47+
await nextTick();
48+
isModalReady.value = true;
49+
},
3650
});
3751
checkProps(extendedApi as ExtendedModalApi, {
3852
...props,
@@ -41,7 +55,7 @@ export function useVbenModal<TParentModalProps extends ModalProps = ModalProps>(
4155
});
4256
return () =>
4357
h(
44-
connectedComponent,
58+
isModalReady.value ? connectedComponent : 'div',
4559
{
4660
...props,
4761
...attrs,
@@ -70,6 +84,13 @@ export function useVbenModal<TParentModalProps extends ModalProps = ModalProps>(
7084
injectData.options?.onOpenChange?.(isOpen);
7185
};
7286

87+
mergedOptions.onClosed = () => {
88+
options.onClosed?.();
89+
if (options.destroyOnClose) {
90+
injectData.reCreateModal?.();
91+
}
92+
};
93+
7394
const api = new ModalApi(mergedOptions);
7495

7596
const extendedApi: ExtendedModalApi = api as never;

0 commit comments

Comments
 (0)