From 4cc0c85a6cb901b500aaf3670bbafdefec26404e Mon Sep 17 00:00:00 2001 From: kuaifan Date: Fri, 18 Jul 2025 09:43:48 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/js/components/MicroApps/iframe.vue | 117 +++++++++++------- 1 file changed, 73 insertions(+), 44 deletions(-) diff --git a/resources/assets/js/components/MicroApps/iframe.vue b/resources/assets/js/components/MicroApps/iframe.vue index 2bab7878c..c1d2e2de5 100644 --- a/resources/assets/js/components/MicroApps/iframe.vue +++ b/resources/assets/js/components/MicroApps/iframe.vue @@ -114,56 +114,15 @@ export default { const {type, message} = e.data; switch (type) { case 'MICRO_APP_READY': - this.handleLoad() - this.isLoading = false - if (message && message.supportBeforeClose) { - 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 - }) - } - } - }) - } + this.handleMessageOfReady(message); break case 'MICRO_APP_METHOD': - if (!this.data || !this.data.methods) { - return - } - const {id, method, args} = message; - if (this.data.methods[method]) { - const postMessage = (result) => { - this.$refs.iframe.contentWindow.postMessage({ - type: 'MICRO_APP_METHOD_RESULT', - message: {id, result: $A.cloneJSON(result)} - }, '*') - } - const before = this.data.methods[method](...args) - if (before && before.then) { - before.then(postMessage).catch(postMessage) - } else { - postMessage(before) - } - } + this.handleMessageOfMethod(message) break case 'MICRO_APP_BEFORE_CLOSE': - if (this.onBeforeClose[message.id]) { - this.onBeforeClose[message.id]() - delete this.onBeforeClose[message.id] - } + this.handleMessageOfBeforeClose(message) break default: @@ -171,6 +130,76 @@ export default { } }, + // 处理消息的准备状态 (MICRO_APP_READY) + handleMessageOfReady(message) { + this.handleLoad() + this.isLoading = false + + if (!message?.supportBeforeClose) { + return + } + 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 + }) + } + } + }) + }, + + // 处理方法消息 (MICRO_APP_METHOD) + handleMessageOfMethod(message) { + if (!this.data || !this.data.methods) { + return + } + + const {id, method, args} = message; + if (!this.data.methods[method]) { + return; + } + + const postMessage = (result) => { + this.$refs.iframe.contentWindow.postMessage({ + type: 'MICRO_APP_METHOD_RESULT', + message: {id, result: $A.cloneJSON(result)} + }, '*') + } + + const postError = (error) => { + this.$refs.iframe.contentWindow.postMessage({ + type: 'MICRO_APP_METHOD_RESULT', + message: {id, result: null, error: error?.message || error} + }, '*') + } + + const before = this.data.methods[method](...args) + if (before && before.then) { + before.then(postMessage).catch(postError) + } else { + postMessage(before) + } + }, + + // 处理方法消息 (MICRO_APP_BEFORE_CLOSE) + handleMessageOfBeforeClose(message) { + if (!this.onBeforeClose[message.id]) { + return + } + this.onBeforeClose[message.id]() + delete this.onBeforeClose[message.id] + }, + // 验证消息是否来自当前 iframe isFromCurrentIframe(event) { try {