javascript - React Portal 解决了什么问题?
问题描述
来自反应门户的文档:
门户的典型用例是父组件具有溢出:隐藏或 z-index 样式,但您需要子组件在视觉上“突破”其容器。例如,对话框、悬停卡片和工具提示。
建议的解决方案是使用:
// this line is rendered in `Portal1` component,
// which is rendered in `Parent1` component.
ReactDOM.createPortal(Child1, Container1)
我不明白它解决了什么问题。为什么让Child1
孩子Container1
代替而不是Parent1
帮助?
我的问题可能不清楚,所以如果没有 -> 此解决方案与创建“对话框、悬停卡和工具提示”的其他解决方案有何不同?
解决方案
当你初始化一个 React 应用程序时,ReactDOM
告诉一个DOM
容器它的所有 React 组件都将在 this 下呈现DOM
。这使得 React 做所有的渲染处理。
有时您需要控制 React 组件作为子元素呈现给不同的DOM
元素,并继续与您的 React 应用程序交互。这就是我们使用 React Portal 的原因
由于 React 在后台创建虚拟元素,因此您无法将转换为DOM
元素并将它们直接插入到DOM
. React Portals 允许你传递一个 React Elements 并为 React Element 指定容器 DOM
这是一个例子:
您有一个在中心Modal
呈现div
元素的组件。
function Modal() {
return (
<div style={{ position: 'absolute', left: '50%'}}>
Message
</div>
);
}
将您的Modal
组件放在div
相对位置内。
<div style={{ position: 'relative', left: 100 }}>
<Modal />
</div>
问题是当Modal
组件被渲染时,它的位置是相对于 parentdiv
的位置,但你需要将它显示在窗口的中心。
为了解决这个问题,您可以使用门户Modal
直接将组件附加到元素body
这是 Portals 的解决方案。
function ModalRenderer() {
return (
React.createPortal(
<Modal />,
document.body
)
);
}
ModalRenderer
并在应用程序中的任何地方使用组件。
<div style={{ position: 'relative', left: 100 }}>
<ModalRenderer />
</div>
ModalRenderer
容器元素Modal
位于 DOM 树之外,但仍在 React 应用程序树中
推荐阅读
- maven - 为 Maven 项目配置 JFrog 工件存储库
- python - 如何使用beautifulsoup获取第一个视频ID?
- html - 内联块父级内的 Flex 子级 - IE11 无法处理布局对齐
- sql - 按年份划分的组内病例百分比
- unicode - 是否有一个大写字母有两个小写字母可供选择?
- c++ - main() 中的 std::cout 在调试期间不在调试控制台中打印任何内容
- gradle - Gradle测试任务执行模式cmdline和intellij之间的不同行为
- javascript - 每次进行克隆时更改每个标签的 ID 的 Javascript 代码是什么?
- snowplow - 使用 Snowplow Micro 验证实体字段
- oracle - Oracle Apex Interactive Report vs Interactive Grid