Vue iframe父子通信

  1. vue 组件嵌入iframe
<!-- vue template-->
<div>
  <iframe src="http://localhost:8081/" ref="iframe" frameborder="0"></iframe>
</div>
mounted() {
  window.addEventListener("message", (e:  any) => {
      const data = e.data;
      console.log(data);  // 输出iframe 消息
      const child = (this.$refs['iframe'] as any);
      child.contentWindow.postMessage('success', '*')  // '*'参数表示没有跨域限制
    }, false);
}
  1. iframe里的vue页面发送消息与接收消息
mounted() {
	// 发送消息
    window.parent.postMessage({
      str: 'hello'
    }, '*'); // '*'参数表示没有跨域限制
    // 接受消息
    window.addEventListener('message', (event: any) => {
      console.log(event.data)
    })
 }
### Vue 中使用 iframe 嵌入 HTML 页面 在 Vue 项目中嵌入 HTML 页面可以通过 `<iframe>` 标签实现。为了更好地管理和控制 iframe 的行为,可以利用 Vue 组件化的优势来封装 iframe。 #### 创建一个简单的 iframe 组件 创建一个新的组件 `IframeComponent.vue`: ```vue <template> <div class="iframe-container"> <iframe :src="url" frameborder="0"></iframe> </div> </template> <script> export default { props: ['url'], }; </script> <style scoped> .iframe-container { width: 100%; height: 600px; } iframe { width: 100%; height: 100%; } </style> ``` 这个组件接收一个 URL 属性并将其设置为 iframe 的源地址[^1]。 #### 在父组件中使用 IframeComponent 假设有一个名为 `ParentComponent.vue` 的父组件,在其中引入并注册 `IframeComponent`: ```vue <template> <div> <button @click="loadPage">加载页面</button> <IframeComponent v-if="showIframe" :url="pageUrl"/> </div> </template> <script> import IframeComponent from './components/IframeComponent'; export default { components: { IframeComponent }, data() { return { showIframe: false, pageUrl: '' }; }, methods: { loadPage() { this.pageUrl = 'https://example.com'; this.showIframe = true; } } }; </script> ``` 这里定义了一个按钮用于触发 iframe 加载指定的 URL 地址,并通过条件渲染的方式显示/隐藏 iframe[^3]。 #### 跨域通信与交互 当涉及到跨域场景下父子页面之间的调用时,则需遵循浏览器的安全策略——同源政策(SOP),即只有协议、域名和端口都相同的情况下才允许直接访问对方的内容窗口对象(window);对于不同源的情况则可通过 postMessage API 实现安全的数据交换[^2]。 例如,在子页面内发送消息给父级 Vue 应用程序: ```javascript // 子页面中的 JavaScript 代码 window.parent.postMessage('来自 iFrame 的问候', '*'); ``` 而在父页面监听这些消息: ```javascript mounted() { window.addEventListener('message', function(event) { console.log(`收到的消息:${event.data}`); }); }, beforeDestroy() { window.removeEventListener('message', /* ... */); } ``` 这样就可以实现在不同的上下文中互相传递数据而不违反安全性原则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aibac

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值