内嵌iframe父子页面间的数据交互(constentWindow.postMessage)

封装postMessage信息交互

/**
* message 传递数据 
* 例:{ type: 'create', data: {x: 1, y: 2, z: 3} } // 新增逻辑 新增数据是data
* target 通信目标 默认取页面第一个iframe
* origin 设置通信范围 默认 (*) 无限制
*/
const postMessageHandle = (message, target = window[0], origin = '*') => {
	target.postMessage(message, origin);
};

1、下面是 parent 页面

**【注意】**iframe 的 src 填自己的地址

import React, { useEffect, useRef } from 'react'

export default function index() {
    const myRef = useRef(null);
	useEffect(() => {
		// 添加message事件,监听iframe页面回传信息
	    window.addEventListener('message', receiveInitMsg, false);

	    return () => {
	      window.removeEventListener('message', receiveInitMsg, false);
	    };
	  }, []);

	const receiveInitMsg = (event) => {
	  console.log('子(iframe)传父', event?.data);
	  if (event?.data?.type === 'send_parent_data') {
	    console.log('保存最后的操作');
	  } else if (event?.data?.type === '回传数据') {
		// 根据 iframe 回传内容,写各自页面逻辑代码 
	  }
	};
	
	// 给iframe页面传递数据
	const parentToChild = () => {
		if (myRef) {
			myRef.contentWindow.postMessage({
				type: 'to iframe child',
				data: {}
			},'*')
		}
	}

  return (
    <div>
       <iframe
	      ref={myRef}
	      src="http://localhost:3000/#/test"
	      frameBorder="0"
	      width="800px"
	      height="600px"
	    />
    </div>
  )
}

2、iframe 子页面

import React, { useEffect, useRef } from 'react';

export default function index() {
  const inpRef = useRef(null);

  useEffect(() => {
    // 添加监听事件,监听父页面回传的消息
    window.addEventListener('message', receiveInitMsg, false);
    // postMessage,向父页面发送消息,默认第一次渲染回传空数据(有默认值回传默认值也行)
    window.parent.postMessage(
      {
        type: 'send_parent_data',
        data: {}
      },
      '*'
    );
    return () => {
      window.removeEventListener('message', receiveInitMsg, false);
    };
  }, []);

  const receiveInitMsg = (event) => {
    console.log(event, 'event父传子触发成功');
    if (event?.data?.type === 'send_child') {
      // 自己的业务逻辑代码
      console.log('父传子(iframe):', event?.data);
      window.parent.postMessage(
        {
          type: 'send_parent_data',
          data: {
            val: inpRef.current.value
          }
        },
        '*'
      );
    } else if (event?.data?.type === 'getPageData') {
      // 自己的业务逻辑代码
    }
  };

  // iframe 页面手动回传数据给父页面
  const iframe_to_parent = () => {
    window.parent.postMessage(
      {
        type: 'send_parent_data',
        data: {
          inpVal: inpRef.current.value
        }
      },
      '*'
    );
  };

  return (
    <div className="child">
      <div>
        <input type="text" ref={inpRef} />
        <button onClick={iframe_to_parent}>发送</button>
      </div>
    </div>
  );
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值