From 35d77e03b909622f875eae9bf0402fda1a5426de Mon Sep 17 00:00:00 2001 From: DCloud_LXH <283700113@qq.com> Date: Wed, 17 Nov 2021 16:54:32 +0800 Subject: [PATCH] feat: closePreviewImage --- .../src/protocols/media/previewImage.ts | 3 ++ .../src/service/api/media/previewImage.ts | 15 ++++++++ packages/uni-h5-vite/lib/api.json | 1 + .../service/api/media/previewImage/index.ts | 36 +++++++++++++++---- 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/packages/uni-api/src/protocols/media/previewImage.ts b/packages/uni-api/src/protocols/media/previewImage.ts index 8ee10b5bf..2ab9574fe 100644 --- a/packages/uni-api/src/protocols/media/previewImage.ts +++ b/packages/uni-api/src/protocols/media/previewImage.ts @@ -30,3 +30,6 @@ export const PreviewImageProtocol: ApiProtocol = { type: [Number, String], }, } + +export const API_CLOSE_PREVIEW_IMAGE = 'closePreviewImage' +export type API_TYPE_CLOSE_PREVIEW_IMAGE = typeof uni.closePreviewImage diff --git a/packages/uni-app-plus/src/service/api/media/previewImage.ts b/packages/uni-app-plus/src/service/api/media/previewImage.ts index 2f5bb7f47..e77d3a92f 100644 --- a/packages/uni-app-plus/src/service/api/media/previewImage.ts +++ b/packages/uni-app-plus/src/service/api/media/previewImage.ts @@ -4,6 +4,8 @@ import { defineAsyncApi, PreviewImageProtocol, PreviewImageOptions, + API_CLOSE_PREVIEW_IMAGE, + API_TYPE_CLOSE_PREVIEW_IMAGE, } from '@dcloudio/uni-api' import { isPlainObject } from '@vue/shared' @@ -96,3 +98,16 @@ export const previewImage = defineAsyncApi( PreviewImageProtocol, PreviewImageOptions ) + +export const closePreviewImage = defineAsyncApi( + API_CLOSE_PREVIEW_IMAGE, + (_, { resolve, reject }) => { + try { + // @ts-expect-error + plus.nativeUI.closePreviewImage() + resolve() + } catch (error) { + reject() + } + } +) diff --git a/packages/uni-h5-vite/lib/api.json b/packages/uni-h5-vite/lib/api.json index c01ec5d6e..bc32c86a6 100644 --- a/packages/uni-h5-vite/lib/api.json +++ b/packages/uni-h5-vite/lib/api.json @@ -17,6 +17,7 @@ "chooseVideo", "clearStorage", "clearStorageSync", + "closePreviewImage", "closeSocket", "connectSocket", "createAnimation", diff --git a/packages/uni-h5/src/service/api/media/previewImage/index.ts b/packages/uni-h5/src/service/api/media/previewImage/index.ts index c855faf6f..3d2e45e8d 100644 --- a/packages/uni-h5/src/service/api/media/previewImage/index.ts +++ b/packages/uni-h5/src/service/api/media/previewImage/index.ts @@ -6,11 +6,22 @@ import { defineAsyncApi, PreviewImageProtocol, PreviewImageOptions, + API_CLOSE_PREVIEW_IMAGE, + API_TYPE_CLOSE_PREVIEW_IMAGE, } from '@dcloudio/uni-api' import { ensureRoot, createRootApp } from '../../ui/popup/utils' import ImagePreview, { Props } from './ImagePreview' let state: Props | null = null +let imagePreviewInstance: ReturnType | null + +const closePreviewImageView = () => { + state = null + nextTick(() => { + imagePreviewInstance?.unmount() + imagePreviewInstance = null + }) +} export const previewImage = defineAsyncApi( API_PREVIEW_IMAGE, @@ -19,13 +30,12 @@ export const previewImage = defineAsyncApi( state = reactive(args) as Props // 异步执行,避免干扰 getCurrentInstance nextTick(() => { - const app = createRootApp(ImagePreview, state as Props, () => { - state = null - nextTick(() => { - app.unmount() - }) - }) - app.mount(ensureRoot('u-a-p')) + imagePreviewInstance = createRootApp( + ImagePreview, + state as Props, + closePreviewImageView + ) + imagePreviewInstance.mount(ensureRoot('u-a-p')) }) } else { extend(state, args) @@ -35,3 +45,15 @@ export const previewImage = defineAsyncApi( PreviewImageProtocol, PreviewImageOptions ) + +export const closePreviewImage = defineAsyncApi( + API_CLOSE_PREVIEW_IMAGE, + (_, { resolve, reject }) => { + if (imagePreviewInstance) { + closePreviewImageView() + resolve() + } else { + reject() + } + } +) -- GitLab