0Pricing
React Academy · 课时

什么是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 什么是 React Portals?
  2. 使用 Portals 构建模态框组件
  3. 处理模态框中的焦点与键盘陷阱
  4. 使用 Portals 构建工具提示与下拉菜单
← 返回 React Academy