浏览代码

feat: iframe expose postmessage function (#3368)

* feat: iframe postmessage

iframe postmessage

* chore: prettier format code

---------

Co-authored-by: invalid w <wangjuesix@gmail.com>
luocong2016 1 年之前
父节点
当前提交
05bc4acb9b
共有 1 个文件被更改,包括 30 次插入1 次删除
  1. 30 1
      src/views/sys/iframe/index.vue

+ 30 - 1
src/views/sys/iframe/index.vue

@@ -12,13 +12,14 @@
 </template>
 <script lang="ts" setup>
   import type { CSSProperties } from 'vue';
-  import { ref, unref, computed } from 'vue';
+  import { ref, unref, computed, onMounted, onUnmounted } from 'vue';
   import { Spin } from 'ant-design-vue';
   import { useWindowSizeFn } from '@vben/hooks';
   import { propTypes } from '@/utils/propTypes';
   import { useDesign } from '@/hooks/web/useDesign';
   import { useLayoutHeight } from '@/layouts/default/content/useContentViewHeight';
 
+  const emit = defineEmits(['message']);
   defineProps({
     frameSrc: propTypes.string.def(''),
   });
@@ -54,6 +55,34 @@
     loading.value = false;
     calcHeight();
   }
+
+  const messageHandler = (e: MessageEvent) => {
+    emit('message', e.data);
+  };
+
+  const postMessage = (message: any, tragetOrigin: string, transfer?: Transferable[]) => {
+    const iframe = unref(frameRef);
+    if (!iframe) return;
+    iframe.contentWindow?.postMessage(message, tragetOrigin, transfer);
+  };
+
+  const reload = () => {
+    loading.value = true;
+    const iframe = frameRef.value;
+    if (!iframe) return;
+    iframe.contentWindow?.location.reload();
+    loading.value = false;
+  };
+
+  onMounted(() => {
+    window.addEventListener('message', messageHandler);
+  });
+
+  onUnmounted(() => {
+    window.removeEventListener('message', messageHandler);
+  });
+
+  defineExpose({ postMessage, reload });
 </script>
 <style lang="less" scoped>
   @prefix-cls: ~'@{namespace}-iframe-page';