实现 ReactDOM.createPortal 时的问题(react 16 功能)

Posted

技术标签:

【中文标题】实现 ReactDOM.createPortal 时的问题(react 16 功能)【英文标题】:Issue when implementing ReactDOM.createPortal (react 16 feature) 【发布时间】:2018-11-02 16:06:00 【问题描述】:

为了清楚起见,假设我有 3 个组件:<Child>, <Parent>, <GrandParent>

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

parent.js

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

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

当单击&lt;Parent&gt; 中的链接时,我希望&lt;Parent&gt; 卸载并&lt;Child&gt;&lt;GrandParent&gt; 中呈现,这是 React 新功能“门户”应该实现的。

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

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

但我不确定如何/在哪里使用这段代码。我尝试的所有内容都在&lt;Parent&gt; 旁边呈现&lt;Child&gt;,这不是我想要的。非常欢迎有关该主题的提示/文档/示例

【问题讨论】:

你能在这里分享整个代码吗?共享的代码有点模棱两可。 createPortal 仅在 elementToRenderInto 内附加 componentToRender。它不会删除任何元素。在您的情况下,我猜 Parent 元素存在于 GrandParent 元素中 实际上代码更复杂,所以我不确定共享所有内容是否会提高可读性。但是,您是对的,它缺少一个重要的细节:Parent 不存在于 GrandParent 中。 了解这个场景会很有趣,你最终想要实现什么? 【参考方案1】:

如果我做对了,祖父组件必须获取对底层 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

【讨论】:

以上是关于实现 ReactDOM.createPortal 时的问题(react 16 功能)的主要内容,如果未能解决你的问题,请参考以下文章

ReactDOM.createPortal

如何在 React 16 中使用 ReactDOM.createPortal()?

ReactDOM.createPortal() 在 next.js-typescript 中创建额外的空白 div

使用 ReactDOM createPortal 为 react-transition-group 设置动画

react 插槽(Portals)

[react] 你有用过React的插槽(Portals)吗?怎么用?