From 898656963de7a5a65f21419464452602aba0943c Mon Sep 17 00:00:00 2001 From: kuaifan Date: Tue, 15 Jul 2025 13:55:12 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/js/components/MicroApps/iframe.vue | 31 +++++++- .../assets/js/components/MicroApps/index.vue | 71 ++++++++++++------- .../assets/js/components/MicroApps/modal.vue | 5 +- resources/assets/js/store/mutations.js | 19 +++++ resources/assets/js/store/state.js | 1 + 5 files changed, 99 insertions(+), 28 deletions(-) diff --git a/resources/assets/js/components/MicroApps/iframe.vue b/resources/assets/js/components/MicroApps/iframe.vue index 015d3c4d0..481ad09f6 100644 --- a/resources/assets/js/components/MicroApps/iframe.vue +++ b/resources/assets/js/components/MicroApps/iframe.vue @@ -37,6 +37,7 @@ export default { data() { return { src: this.url, + onBeforeClose: {}, } }, @@ -87,8 +88,26 @@ export default { switch (type) { case 'MICRO_APP_READY': this.injectMicroApp() + this.$store.commit('microApps/update', { + name: this.name, + data: { + onBeforeClose: () => { + return new Promise(resolve => { + const message = { + id: $A.randomString(16), + name: this.name + } + this.$refs.iframe.contentWindow.postMessage({ + type: 'MICRO_APP_BEFORE_CLOSE', + message + }, '*') + this.onBeforeClose[message.id] = resolve + }) + } + } + }) break - + case 'MICRO_APP_METHOD': if (!this.data || !this.data.methods) { return @@ -109,6 +128,14 @@ export default { } } break + + case 'MICRO_APP_BEFORE_CLOSE': + if (this.onBeforeClose[message.id]) { + this.onBeforeClose[message.id]() + delete this.onBeforeClose[message.id] + } + break + default: break } @@ -117,7 +144,7 @@ export default { // 验证消息是否来自当前 iframe isFromCurrentIframe(event) { try { - const { source } = event + const {source} = event return this.$refs.iframe && source === this.$refs.iframe.contentWindow } catch (error) { // console.error('Failed to validate message from current iframe:', error) diff --git a/resources/assets/js/components/MicroApps/index.vue b/resources/assets/js/components/MicroApps/index.vue index 066b790a6..3f4b36710 100644 --- a/resources/assets/js/components/MicroApps/index.vue +++ b/resources/assets/js/components/MicroApps/index.vue @@ -1,7 +1,7 @@