当前位置: 首页 > 面试题库 >

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

云季萌
2023-03-14
问题内容

我正在使用React 16,并且需要门户网站,但是无法找到有关此功能的任何文档。有人知道怎么使用吗?

https://github.com/facebook/react/pull/10675

感谢您的任何建议。


问题答案:

React
v16刚刚发布了几个小时(正式版),正式支持Portal

什么是门户? 到现在已经有多久了?

门户网站提供了一种一流的方式来将子级呈现到父组件的DOM层次结构之外的DOM节点中。

Portal在React社区中不是新概念。有许多支持这种功能的库。例如react-
portal
和react-
gateway

呈现任何React应用时会发生什么?

通常,在渲染任何React应用程序时,单个DOM元素用于渲染整个React树。

class HelloReact extends React.Component {
   render() {
       return (
          <h1>Hello React</h1>
       );
   }
}

ReactDOM.render(<HelloReact />, document.getElementById('root'));

如您所见,我们正在将我们的react组件渲染为一个具有id的DOM元素root

什么是门户网站?为什么需要门户网站? 为什么在那儿?

门户网站是一种在父组件的主DOM层次结构之外呈现React子代 而又不会丢失react上下文的方法
。我强调这一点是因为非常流行的库,例如react-router,redux大量使用了react上下文。因此,使用时的上下文可用性Portal非常有帮助。

根据反应文档,

门户的典型用例是父组件发生溢出:隐藏或z-index样式,但是您需要子组件以可视方式“脱离”其容器。例如,对话框,悬浮卡和工具提示。

因此,使用门户网站时,您可以在需要时将并行反应树渲染到另一个DOM节点上。即使将其呈现在不同的DOM节点中,父组件也可以捕获未捕获的事件。请参阅文档本身中提供的此Codepen。

下面的示例应该给您更多的想法:

// index.html
<html>
    <body>
        <div id="root"></div>
        <div id="another-root"></div>
    </body>
</html>

// index.jsx
const mainContainer = document.getElementById('root');
const portalContainer = document.getElementById('another-root');

class HelloFromPortal extends React.Component {
    render() {
         return (
           <h1>I am rendered through a Portal.</h1>
         );
    }
}

class HelloReact extends React.Component {
    render() {
        return (
             <div>
                 <h1>Hello World</h1>
                 { ReactDOM.createPortal(<HelloFromPortal />, portalContainer) }
             </div>
        );
    }
}

ReactDOM.render(<HelloReact />, mainContainer);

https://codesandbox.io/s/62rvxkonnw

您可以使用devtools inspect元素,查看<h1>I am rendered through a Portal.</h1>#another-root标签内部呈现的元素,而<h1>Hello World</h1>#root标签内部呈现的元素。

希望这可以帮助 :)

更新 :回答@PhillipMunin的评论。

ReactDOM.render和 之间有什么区别ReactDOM.createPortal

  1. 即使通过门户网站呈现的组件已呈现在其他位置(当前容器根外部),它仍作为同一父组件的子组件存在。(谁调用ReactDOM.createPortal),因此子级上的所有事件都将传播到父级。(Ofc,如果您手动停止事件的传播,则此方法无效。)

  2. 通过门户网站呈现的组件内部可以访问相同的上下文。但是,如果我们ReactDOM.render直接这样做,情况并非如此。

我创建了另一个演示来说明我的观点。https://codesandbox.io/s/42x771ykwx



 类似资料:
  • 我最近升级到光纤了。在15中,当组件更新时,更新堆栈跟踪如下所示 您如何在Fiber(React 16)中找到更新的起源?

  • 问题内容: 我想使用Android Studio使用Gradle构建工具开发应用程序。我无法在上插入存储库和库。我的文件如下: 如何在项目中添加OpenCV? 问题答案: 您可以在Android Studio中轻松完成此操作。 请按照以下步骤将Open CV作为库添加到您的项目中。 libraries在项目主目录下创建一个文件夹。例如,如果您的项目是OpenCVExamples,则将创建一个Ope

  • 我想使用Android Studio开发一个应用程序使用Gradle构建工具。我无法在上插入OpenCV repo和库。我的文件如下所示: 我如何在我的项目中添加OpenCV?

  • 本文向大家介绍React16新特性有哪些?相关面试题,主要包含被问及React16新特性有哪些?时的应答技巧和注意事项,需要的朋友参考一下 1.使用Error Boundary处理错误组件 2.render支持2种新的返回类型(数组、字符串) 3.使用createProtal 将组件渲染到当前组件树之外 4.自定义DOM属性 :把不会识别的属性传递给DOM 5.setState传入null时不会再

  • 问题内容: 我想对英语句子加标签,并进行一些处理。我想使用openNLP。我已经安装了 当我执行命令时 它提供输出POSTagging Text.txt中的输入 我希望它安装正确吗? 现在如何从Java应用程序内部进行此POStagging?我已将openNLPtools,jwnl,maxent jar添加到项目中,但是如何调用POStagging? 问题答案: 这是我放在一起的一些(旧)示例代码

  • 问题内容: 我必须在GWT入口点使用java.util.Calendar,但是在运行应用程序时出现错误,这是因为GWT无法找到源代码,无论如何我都可以解决此问题。 提前致谢!!! 问题答案: java.util.Calendar不是模拟的类。您可以在此处找到仿真类的列表: http://code.google.com/webtoolkit/doc/latest/RefJreEmulation.ht