
API 监控与指标仪表盘:保障系统平稳运行的核心实践
createPortal
API 简介createPortal
是 React DOM 的一部分,允许开发者将 React 组件的子元素渲染到 DOM 中的其他位置。尽管 portal 的渲染位置不同,但其行为与普通 React 子组件一致。这一特性使得创建工具提示、通知框、模态框和弹窗等 UI 变得更加简单高效。
createPortal
API?通常情况下,React 组件与其子组件存在父子关系,所有子组件渲染后都嵌套在父组件内。然而,通过 createPortal
,React 组件可以将部分或全部子组件渲染到 DOM 中非父节点的位置。
createPortal
函数签名ReactDOM.createPortal(children, domNode, [key])
children
:React 组件、JSX、React Fragment、字符串、数字或这些类型的数组domNode
:目标 DOM 节点,可通过 document.getElementById
或其他 DOM 查询方式获取key
(可选):用于标识 portal 的唯一字符串或数字createPortal
返回一个 React 节点,可以在组件返回 JSX 或嵌套在其他组件中使用。
createPortal
的核心特性Portal 仅改变组件在 DOM 中的渲染位置,其行为与普通组件一致。例如,从 portal 触发的事件沿着 React 树冒泡,而非 DOM 树。
Portal 虽然渲染在 DOM 的其他位置,但仍然是渲染它的父组件的子组件。父组件 props 或 context 改变时,portal 会重新渲染。
createPortal
的优势Portal 可以将元素渲染到父组件之外的 DOM 节点,适用于工具提示、模态框等 UI 组件。
Portal 允许 React 组件在非 React 的第三方库中渲染,为集成提供便利。参考示例
createPortal
的最佳实践尽量保持 portal 内部组件简单,减少维护成本。示例模态框:
import ReactDOM from 'react-dom';
import React from 'react';
const Modal = ({ isOpen, children, onClose }) = > {
if (!isOpen) return null;
return ReactDOM.createPortal(
< div className="modal" >
{children}
< button onClick={onClose} > 关闭 < /button >
< /div > ,
document.getElementById('modal-root')
);
};
在父组件中管理影响 portal 的状态,避免在 portal 内部管理状态。
Portal 不会继承父组件的 CSS 样式,需要显式传递:
const style = { color: 'red' };
ReactDOM.createPortal( < p style={style} > Hello, Portal! < /p > , document.getElementById('modal-root'));
确保 portal 内容对屏幕阅读器友好,使用 ARIA 角色和属性增强可访问性。
createPortal
的局限性Portal 不会继承父组件 CSS,可能导致样式问题,特别是在复杂布局中。
多个相互依赖的 portal 增加维护和调试难度,DOM 渲染位置与 React 组件层级不一致可能造成理解难度。
Portal 的事件沿 React 树冒泡,而非 DOM 树,可能导致调试困难。
createPortal
的常见用途const Modal = ({ isOpen, onClose }) = > {
if (!isOpen) return null;
return ReactDOM.createPortal(
< div className="modal" >
< p > 这是一个模态框 < /p >
< button onClick={onClose} > 关闭 < /button >
< /div > ,
document.getElementById('modal-root')
);
};
Portal 支持将 React 组件渲染到 DOM 的任意位置,方便在静态页面或非 React 应用中使用。
expect(document.getElementById('modal-root').textContent).toBe('Hello, Portal!');
验证按钮点击是否触发正确逻辑,例如关闭模态框。
检查 ARIA 属性是否正确设置,确保屏幕阅读器可访问 portal 内容。
父组件卸载时,确保 portal 内容正确卸载,避免内存泄漏。
createPortal
是 React DOM 提供的强大工具,允许开发者将子组件渲染到 DOM 的其他位置。它在构建模态框、工具提示、弹窗和通知框等 UI 组件时非常实用。
使用时需注意样式继承、事件冒泡路径和复杂性等问题。通过遵循最佳实践和测试方法,可以充分发挥 createPortal
的优势,提供灵活高效的用户交互体验。
原文链接
Refine 官方博客