使用postMessage 实现React和iframe通信

本文分享了在React项目中使用iframe引入第三方3D引擎模型页面,并通过window.postMessage()实现跨域通信的方法。详细介绍了如何在React组件中监听message事件,以及如何在iframe中接收并响应从React发送的数据。

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

最近项目里需要用到第三方的3d引擎模型的页面,框架用的是react ,直接用iframe引入的,这个页面需要进行二次开发 不太想在这个页面写大量业务代码,直接调接口也会存在跨域问题, 如果可以确保两个页面之间相互通信,所有的逻辑代码可以在react上实现,iframe只需要拿到最终数据渲染模型就完美了,发现HTML5新增了一个API window.postMessage(), 决定用iframe结合window.postMessage()实现。

react页面:

	componentDidMount() {
        // 监听message事件
        window.addEventListener("message", this.receiveMessage, false);
    }
    componentWillUnmount() {
        window.removeEventListener("message", this.receiveMessage)
    }
    receiveMessage =  ( event ) => {
        console.log(event)
        if(event!==undefined &&event.data && event.data.name){
            console.log( '我是react,我接受到了来自iframe的数据:', event.data );
        }
    };
    // 向iframe发送数据
     handleClick = () => {
        //必须是iframe加载完成后才可以向子域发送数据
        const childFrameObj = document.getElementById('BlackHoleModel');
    	childFrameObj.contentWindow.postMessage([684,685,686,687], '*');
    };
    render() {
    	return (
    		<Fragment>
    				<Button onClick={this.handleClick.bind(this)}>向iframe发送数据</Button>
                    <iframe id="Model" src={ModelUrl} title="引擎" />
                </Fragment> 
    	)
    }

ifame页面

js:

window.onload = function(event){
   	//监听message事件 接收react传过来的参数
	window.addEventListener("message", receiveMessageFromReact, false);   
	//  自定义事件 --> 监听页面鼠标点击模型的操作
	document.addEventListener("RealBIMSelModel", GetCurProbeRet);
}
// 接收react发送的数据
function receiveMessageFromReact( event ) {
  console.log( '我是iframe,我接收到了数据:', event.data );
  window.reactData = event.data;
};

//向react发送数据
function GetCurProbeRet(){
  proberet = REgetCurProbeRet();  //获取当前选中点相关参数
  console.log(proberet);
  if (proberet.m_uSelActorSubID_L32) {
    var data = {
      name: '来自iframe的信息',
      data: proberet
    }
    parent.postMessage(data,'*'); //window.postMessage
  }

在react页面点击按钮控制台输出
在这里插入图片描述

在iframe里点击模型
在这里插入图片描述
但每次页面初始加载时候react 中的receiveMessage方法的console.log(event) 打印了很多次 当iframe执行GetCurProbeRet()方法才会向react发送数据的。
在这里插入图片描述
不知道是不是postMessage的机制还是react多次渲染的问题 后面再找时间研究

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值