什么是 React Portals?
了解 createPortal API,以及在根 div 外渲染为何有用。
什么是 React Portals? 是 CoddyKit 上的免费 React Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。
欢迎
在本课中,您将学习什么是 React 门户、为什么在父级 DOM 树之外进行渲染很有用,以及如何使用 createPortal API。
普通的 React DOM 层级结构
默认情况下,每个组件都会在其父组件的 DOM 节点内进行渲染。整个 React 应用通常都位于一个 `
` 中。只要您需要让模态框、工具提示或下拉菜单脱离带有 `overflow: hidden` 的父元素,这种方式就会出现问题。
什么是门户
**门户**可以将组件的输出渲染到另一个 DOM 节点中,也就是 React 根节点之外的节点。组件的 React 树不会改变,只有 DOM 位置发生变化。
import { createPortal } from 'react-dom';
function Modal({ children }) {
return createPortal(
children,
document.body // render into body, not parent
);
}门户为何存在
`overflow: hidden`、`z-index` 堆叠上下文以及父元素上的 `transform` 等 CSS 属性,可能会裁剪或隐藏子元素。门户通过将渲染结果附加到另一个 DOM 节点来避开这些限制。
事件冒泡仍然有效
即使门户的 DOM 节点位于父元素之外,**React 事件仍会冒泡**,但它们会沿 React 组件树冒泡,而不是沿 DOM 树冒泡。门户模态框中的点击事件会冒泡到其 React 父组件。
创建门户目标节点
您可以将内容传送到任何现有的 DOM 节点中。一种常见做法是在 `index.html` 中添加专用的 `
`,然后将模态框内容传送到其中,从而保持主应用根节点整洁。
// index.html
<body>
<div id="root"></div>
<div id="modal-root"></div>
</body>
// Modal.jsx
createPortal(children, document.getElementById('modal-root'));门户生命周期与其 React 父组件绑定
门户会在其父组件挂载时挂载,并在父组件卸载时卸载。React 仍会将它视为同一组件树的一部分,因此上下文和引用仍能正常工作。
门户之间的上下文仍然有效
由于门户仍然属于 React 组件树的一部分,因此在门户上方提供的上下文值在门户内部仍然可以访问。DOM 位置不会影响 React 上下文链。
结合状态使用 createPortal
请使用状态来控制门户的可见性。使用按钮切换状态后,门户内容会出现在 document.body 中,而按钮仍保留在其正常的 DOM 位置。
function App() {
const [open, setOpen] = useState(false);
return (
<div>
<button onClick={() => setOpen(true)}>Open</button>
{open && createPortal(
<div className="overlay">
<button onClick={() => setOpen(false)}>Close</button>
</div>,
document.body
)}
</div>
);
}服务端渲染与门户
门户要求 DOM 节点已经存在,因此始终在客户端运行。在 Next.js 或其他 SSR 设置中,请确保门户渲染代码只在浏览器中运行,可以使用 `useEffect` 或已挂载状态检查来实现。
快速检查
React 门户会将内容渲染到另一个 DOM 节点中。这会影响 React 组件树的哪一方面?
回顾
门户可以使用 createPortal() 将 React 输出渲染到任意 DOM 节点中。React 树、上下文和事件冒泡都不会受到影响。请使用门户来避开模态框和工具提示所面临的溢出或 z-index 限制。
接下来
下一课:**使用门户构建模态框组件**——您将构建一个完全可复用的模态框,通过 open/close 状态管理将其传送到 document.body 中。
常见问题解答
「什么是 React Portals?」课时是免费的吗?
是的 — 「什么是 React Portals?」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。
「什么是 React Portals?」这节课中我会学到什么?
了解 createPortal API,以及在根 div 外渲染为何有用。 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 React Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「什么是 React Portals?」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 React Academy 课中编写并运行代码吗?
能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 什么是 React Portals?
- 使用 Portals 构建模态框组件
- 处理模态框中的焦点与键盘陷阱
- 使用 Portals 构建工具提示与下拉菜单