弹出窗口中的React以何种方式与父窗口通信?

时间:2015-09-02 18:11:32

标签: reactjs

我有一个OAuth进程弹出一个窗口,但是当我登录时,重定向到OAuth回调页面发生在弹出窗口而不是父窗口(window.opener)。这可能有点hacky,但我想让弹出窗口告诉父母"我们已获得授权!"

这实际上有效:

OAuthCallback = React.createClass({
  displayName: 'OAuthCallback',

  render() {
    window.opener.console.log('hello parent window');

    return (
      <div>
        Hi, OAuth is process is done.
      </div>
    )
  }
});

但是我想知道是否有某些方法可以让弹出窗口告诉父窗口调用prop函数,例如this.props.oauthSucceeded()

3 个答案:

答案 0 :(得分:11)

当您无法在组件之间建立任何父子关系或兄弟关系时,React建议您设置一个事件系统。

  

用于两个没有组件的组件之间的通信   亲子关系,您可以设置自己的全局事件   系统。订阅componentDidMount()中的事件,取消订阅   componentWillUnmount(),并在收到事件时调用setState()。   Flux模式是安排这种方式的可能方式之一。

请参阅https://facebook.github.io/react/tips/communicate-between-components.html

查看((Number) (matchesArray.get(0))).longValue(); 进行跨窗口通信(https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

答案 1 :(得分:4)

Eelke的建议很明显。

我在子窗口中使用了window.postMessage(),然后window.close(),然后在main / master组件的window.addEventListener('message', function(){})方法中添加了componentDidMount

查看https://facebook.github.io/react/tips/dom-event-listeners.html了解详情!

答案 2 :(得分:0)

我有一个独特的情况,我必须处理来自asp.net应用程序的iframed react弹出窗口。除了关闭它的其他方法之外,我还必须提供一个x按钮以通过在父asp.net中调用一个closePopup方法来关闭弹出窗口。我使用了window.parent。下面是我的用法。

if (window && window.parent) {
    window.parent.closePopup();
}