实现ReactDOM.createPortal时出现问题(反应16功能)

时间:2018-05-23 15:28:30

标签: reactjs dom react-router jsx react-16

为了澄清,我们说我有3个组成部分:<Child>, <Parent>, <GrandParent>

我尝试在<Child>内呈现<GrandParent>,而不呈现<Parent>(从中调用<Child>)。

parent.js

class Parent extends Component {
  ...
  componentDidMount() {
    return (
      <Route ... component={ Child } />
    );
  }

  render() {
  // the <Route> element is rendered here
  }
}

点击<Parent>中的链接,我希望<Parent>卸载<Child>以在<GrandParent>内呈现,这就是React的新功能&#39; Portal& #39;应该实现。

从文档中,我们应该如何实现它:

ReactDOM.createPortal(componentToRender, elementToRenderInto);
// Hence in my case:
ReactDOM.createPortal(<Child />, document.getElementById('grand-parent'));

但我不确定如何/在何处使用这段代码。我尝试的所有内容都在<Child>旁边呈现<Parent>,这不是我想要的。关于这个主题的提示/文档/例子非常受欢迎

1 个答案:

答案 0 :(得分:0)

如果我做对了,祖父组件必须获取对底层DOM节点的引用并将其传递给parent,然后parent使用child呈现一个门户。

我想这可能是你想要实现的目标:

class GrandParent extends React.Component {
  state = {};
  getRef = that => this.setState({ self: that });
  render() {
    return (
      <div ref={this.getRef} style={{}}>
        +
        <Parent parent={this.state.self}>
          <Child />
        </Parent>
        +
      </div>
    );
  }
}

class Parent extends React.Component {
  render() {
    if (this.props.parent)
      return createPortal(this.props.children, this.props.parent);
    return (
      <div>
        parent<Child />
      </div>
    );
  }
}

class Child extends React.Component {
  render() {
    return <div>child</div>;
  }
}

codesandbox