Portal
默认情况下,所有的组件都是会被渲染到 React DOM 树中,但是在一些特别需求的情况下,组件就会需要脱离 DOM 树,独立位于页面的某一个部分。为了打到这个目的,React 提供了 Portal。Portal 提供了一种将子节点渲染到父节点以外的 DOM 节点的解决方案。一个最经典的例子是渲染一个全局的 Modal 对话框,这种对话框通常会被插入到 body
中来完成复用。
用来创建 Portal 的函数是React.createPortal(children, domNode, key?)
。其中children
代表了一个要被放置在domNode
位置的 React 组件,domNode
则是用来指定一个用来存放 Portal 内容的 HTML DOM 节点,通常会使用document.body
。
例如可以这样来创建一个放置在document.body
里的节点。
import { createPortal } from "react";
function Modal() {
return (
<div>
<p>以下节点在document.body中。</p>
{createPortal(<p>Portal节点</p>, document.body)}
</div>
);
}
Portal 只会改变 DOM 节点所在的位置,并不会改变节点的渲染和逻辑处理行为。而且 Portal 节点依旧可以访问 React DOM 树中父级节点提供的 Context 对象,其产生的事件也会沿着 React DOM 树进行冒泡。