react 嵌套iframe_React嵌套iframe,使用postMassage进行交互

本文介绍了如何在React应用中嵌套iframe并使用window.postMessage进行跨域通信。详细展示了在父组件和iframe之间,如何发送和接收数据的步骤及示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iframe是什么? 引用:MDN

window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以及主机 (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。

从广义上讲,一个窗口可以获得对另一个窗口的引用(比如 targetWindow = window.opener),然后在窗口上调用

targetWindow.postMessage() 方法分发一个 MessageEvent 消息。接收消息的窗口可以根据需要自由处理此事件。传递给window.postMessage() 的参数(比如 message )将通过消息事件对象暴露给接收消息的窗口。

react数据传递给iframe

在父组件中引入iframe

import React from 'react';

export default function Demo() {

return (

<>

{/*

{REACT_APP_ENV}
*/}

{REACT_APP_ENV === 'dev' ? (

src="http://10.0.0.208:8000/apidata/databases?name=23124"

frameBorder="0"

height="900px"

width="100%"

id="childFrame"

/>

) : (

正式环境

)}

>

);

}

2.在父页面中添加button并且按钮注册事件

import React from 'react';

export default function Demo() {

return (

<>

onClick={() => {

// 必须是iframe加载完成后才可以向子域发送数据

const childFrameObj = document.getElementById('calculation');

childFrameObj.contentWindow.postMessage(1233, '*'); // window.postMessage

}}

>

点击我向iframe传值

{REACT_APP_ENV === 'dev' ? (

// src="http://10.0.0.208:8000/apidata/databases?name=23124"

// src="http://192.168.3.81:8002/apidata/databases?name=23124"

frameBorder="0"

height="900px"

width="100%"

id="childFrame"

/>

) : (

正式环境

)}

>

);

}

3.在iframe页面中添加事件处理函数,并且监听message事件

// 添加事件处理函数

function receiveMessageFromIndex ( event ) {

console.log( '我是iframe,我接收到了:', event.data );

}

// 监听message事件

window.addEventListener("message", receiveMessageFromIndex, false);

iframe数据传输给react页面

1.在iframe页面添加惦记事件,使用postMessage传递数据

onClick={() => {

window.parent.postMessage('iframe传递的信息', '*');

}}

/>

2.在父组件中通过生命中期componentDidMount方法接收iframe代码(也可使用useEffect函数接收)

import React, { useEffect } from 'react';

export default function BusinessGuarantee() {

function receiveMessageFromIndex(params: any) {

if (params) {

console.log('react页收到的iframe信息:', params.data);

}

}

useEffect(() => {

// 监听message事件

window.addEventListener('message', receiveMessageFromIndex, false);

}, []);

return <>>;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值