Browse Source
fix: auto close popup on deactivated (#6368)
* 修复挂载到内容区域的弹窗和抽屉被意外关闭的问题
pull/6371/head
Netfan
1 year ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with
40 additions and
18 deletions
-
packages/@core/ui-kit/popup-ui/src/drawer/drawer.vue
-
packages/@core/ui-kit/popup-ui/src/drawer/use-drawer.ts
-
packages/@core/ui-kit/popup-ui/src/modal/modal.vue
-
packages/@core/ui-kit/popup-ui/src/modal/use-modal.ts
|
|
|
@ -1,7 +1,15 @@ |
|
|
|
<script lang="ts" setup> |
|
|
|
import type { DrawerProps, ExtendedDrawerApi } from './drawer'; |
|
|
|
|
|
|
|
import { computed, provide, ref, unref, useId, watch } from 'vue'; |
|
|
|
import { |
|
|
|
computed, |
|
|
|
onDeactivated, |
|
|
|
provide, |
|
|
|
ref, |
|
|
|
unref, |
|
|
|
useId, |
|
|
|
watch, |
|
|
|
} from 'vue'; |
|
|
|
|
|
|
|
import { |
|
|
|
useIsMobile, |
|
|
|
@ -94,6 +102,16 @@ const { |
|
|
|
// }, |
|
|
|
// ); |
|
|
|
|
|
|
|
/** |
|
|
|
* 在开启keepAlive情况下 直接通过浏览器按钮/手势等返回 不会关闭弹窗 |
|
|
|
*/ |
|
|
|
onDeactivated(() => { |
|
|
|
// 如果弹窗没有被挂载到内容区域,则关闭弹窗 |
|
|
|
if (!appendToMain.value) { |
|
|
|
props.drawerApi?.close(); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
function interactOutside(e: Event) { |
|
|
|
if (!closeOnClickModal.value || submitting.value) { |
|
|
|
e.preventDefault(); |
|
|
|
|
|
|
|
@ -9,7 +9,6 @@ import { |
|
|
|
h, |
|
|
|
inject, |
|
|
|
nextTick, |
|
|
|
onDeactivated, |
|
|
|
provide, |
|
|
|
reactive, |
|
|
|
ref, |
|
|
|
@ -72,13 +71,6 @@ export function useVbenDrawer< |
|
|
|
}, |
|
|
|
); |
|
|
|
|
|
|
|
/** |
|
|
|
* 在开启keepAlive情况下 直接通过浏览器按钮/手势等返回 不会关闭弹窗 |
|
|
|
*/ |
|
|
|
onDeactivated(() => { |
|
|
|
(extendedApi as ExtendedDrawerApi)?.close?.(); |
|
|
|
}); |
|
|
|
|
|
|
|
return [Drawer, extendedApi as ExtendedDrawerApi] as const; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -1,7 +1,16 @@ |
|
|
|
<script lang="ts" setup> |
|
|
|
import type { ExtendedModalApi, ModalProps } from './modal'; |
|
|
|
|
|
|
|
import { computed, nextTick, provide, ref, unref, useId, watch } from 'vue'; |
|
|
|
import { |
|
|
|
computed, |
|
|
|
nextTick, |
|
|
|
onDeactivated, |
|
|
|
provide, |
|
|
|
ref, |
|
|
|
unref, |
|
|
|
useId, |
|
|
|
watch, |
|
|
|
} from 'vue'; |
|
|
|
|
|
|
|
import { |
|
|
|
useIsMobile, |
|
|
|
@ -135,6 +144,16 @@ watch( |
|
|
|
// }, |
|
|
|
// ); |
|
|
|
|
|
|
|
/** |
|
|
|
* 在开启keepAlive情况下 直接通过浏览器按钮/手势等返回 不会关闭弹窗 |
|
|
|
*/ |
|
|
|
onDeactivated(() => { |
|
|
|
// 如果弹窗没有被挂载到内容区域,则关闭弹窗 |
|
|
|
if (!appendToMain.value) { |
|
|
|
props.modalApi?.close(); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
function handleFullscreen() { |
|
|
|
props.modalApi?.setState((prev) => { |
|
|
|
// if (prev.fullscreen) { |
|
|
|
|
|
|
|
@ -5,7 +5,6 @@ import { |
|
|
|
h, |
|
|
|
inject, |
|
|
|
nextTick, |
|
|
|
onDeactivated, |
|
|
|
provide, |
|
|
|
reactive, |
|
|
|
ref, |
|
|
|
@ -71,13 +70,6 @@ export function useVbenModal<TParentModalProps extends ModalProps = ModalProps>( |
|
|
|
}, |
|
|
|
); |
|
|
|
|
|
|
|
/** |
|
|
|
* 在开启keepAlive情况下 直接通过浏览器按钮/手势等返回 不会关闭弹窗 |
|
|
|
*/ |
|
|
|
onDeactivated(() => { |
|
|
|
(extendedApi as ExtendedModalApi)?.close?.(); |
|
|
|
}); |
|
|
|
|
|
|
|
return [Modal, extendedApi as ExtendedModalApi] as const; |
|
|
|
} |
|
|
|
|
|
|
|
@ -130,6 +122,7 @@ export function useVbenModal<TParentModalProps extends ModalProps = ModalProps>( |
|
|
|
}, |
|
|
|
); |
|
|
|
injectData.extendApi?.(extendedApi); |
|
|
|
|
|
|
|
return [Modal, extendedApi] as const; |
|
|
|
} |
|
|
|
|
|
|
|
|