FinOps有望降低企业50%+的云成本! 了解详情
写点什么

React Portals 简述及其用例

  • 2020-11-30
  • 本文字数:1611 字

    阅读完需:约 5 分钟

React Portals 简述及其用例

React Portal 是一种优秀的方法,可以将子组件渲染到由组件树层次结构定义的父 DOM 层次结构之外的 DOM 节点中。Portal 的最常见用例是子组件需要从视觉上脱离父容器的情况,如下所示。


  • 模态对话框

  • 工具提示

  • 悬浮卡片

  • 加载器


可以使用 ReactDOM.createPortal(child, container)创建一个 Portal。这里的 child 是一个 React 元素、片段或字符串,而 container 是 Portal 应该注入到的 DOM 位置(节点)。


以下是使用上述 API 创建的一个示例模态(modal)组件。


const Modal =({ message, isOpen, onClose, children })=> {  if (!isOpen) return null  return ReactDOM.createPortal(        <div className="modal">      <span className="message">{message}</span>      <button onClick={onClose}>Close</button>    </div>,    domNode)}
复制代码


即使 Portal 是在父 DOM 元素外部渲染的,其行为也类似于应用程序中的常规 React 组件。它可以访问 props 和 context API。这是因为 Portal 位于 React Tree 层次结构内。想要看一看 React Portal 的实践示例,请查看在 Bit 的组件中心上分享的这个组件(你也可以使用 Bit 共享和重用组件):


示例:使用 React Portal 的 React 组件——在 Bit.dev 上分享


我们为什么需要它?


当我们在特定元素(父组件)中使用模态时,模态的高度和宽度将从模态所在的组件继承。因此,模态可能会被裁剪,而无法在应用程序中正确显示。传统上模态需要 CSS 属性,如 overflow:hidden 和 z-index,以避免出现这一问题。


被父组件覆盖高度和宽度的一个典型模态


上面的代码示例将导致在根下的嵌套组件内部渲染这个模态。使用浏览器检查这个应用程序时,它将显示元素,如下所示。


没有 React Portal 的模态渲染


让我们看看如何在这里使用 React Portal。以下代码将使用 createPortal(),在 root 树层次结构之外创建一个 DOM 节点来解决这个问题。


const Modal =({ message, isOpen, onClose, children })=> {  if (!isOpen) return null;  return ReactDOM.createPortal(     <div className="modal">      <span>{message}</span>      <button onClick={onClose}>Close</button>     </div>    ,document.body);  }function Component() {  const [open, setOpen] = useState(false)  return (    <div className="component">      <button onClick={() => setOpen(true)}>Open Modal</button>      <Modal        message="Hello World!"        isOpen={open}        onClose={() => setOpen(false)}      />    </div>  )}
复制代码


下面显示的是一个 DOM 树层次结构,这是在使用 React Portal 时产生的,其中模态将被注入到 root 的外部,并与 root 处于同一级别。


使用 React Portal 渲染的模态


由于这个模态是在根层次结构之外渲染的,因此其尺寸不会被父组件继承或更改。


渲染为 Portal 的模型


你可以在这个 CodeSandbox 中找到这个示例,在其中可以试用代码、查看 Portal 的工作方式并解决所讨论的问题。


使用 Portal 时要注意的事项


使用 React Portal 时,你应该注意几个问题。下面提到的这些行为并不是直观可见的,你需要了解它们才行,因此我想在这里提一下。


  • 事件冒泡(Event Bubbling)将照常工作:通过将事件传播到 React 树的祖先,事件冒泡将按预期工作,而与 DOM 中的 Portal 节点位置无关。

  • React 可以控制 Portal 节点及其生命周期:通过 Portal 渲染子元素时,React 仍然可以控制其生命周期。

  • Portal 仅影响 DOM 结构:Portal 仅影响 HTML DOM 结构,而不影响 React 组件树。

  • 预定义 HTML 挂载点:使用 Portal 时,你需要定义一个 HTML DOM 元素作为 Portal 组件的挂载点。


小结


当我们需要在正常的 DOM 层次结构之外渲染子组件,而又不通过 React 组件树层次结构破坏事件传播的默认行为时,React Portal 就会派上用场。当渲染诸如模态、工具提示、弹出消息之类的组件时,它会很有用。


你可以在 React 官方文档中找到有关 Portal 的更多信息


感谢阅读,请在下面的评论中分享你对这个主题的问题和评论,干杯!


原文链接:React Portals 简述及其用例


2020-11-30 17:141843

评论

发布
暂无评论
发现更多内容

Cloud Kernel SIG月度动态:发布 Anolis 8.8 镜像、kABI 社区共建流程

OpenAnolis小助手

镜像 龙蜥社区 sig kernel 月报

重构这件“小”事儿 | 得物技术

得物技术

直播预告 | 字节跳动云原生大数据分析引擎 ByConity 与 ClickHouse 有何差异?

墨天轮

大数据 字节跳动 Clickhouse 数仓

2023 最新版 Java 面试八股文大全 PDF 版限时分享,含 700 道高频面试题

三十而立

为什么医疗保健需要MFT来帮助保护EHR文件传输

镭速

Sibelius2023免费版音乐制谱软件

茶色酒

Sibelius2023

各行业常见的业务指标汇总(数据分析常用数据指标)

Data 探险实验室

数据分析 数据分析师 数据指标 指标中台; 数据分析 指标洞察

【已结束】直播预告|传统 PvE 游戏 ∕ 开房间 PvP 游戏的云原生架构升级

阿里巴巴云原生

阿里云 云原生 游戏

架构误区系列16:不可靠的幂等

agnostic

幂等设计

今天,飞桨公众号六岁啦!

飞桨PaddlePaddle

飞桨PaddlePaddle

新手如何学好Zbrush3D建模?

Finovy Cloud

3D软件

基于容器平台 ACK 快速搭建 Stable Diffusion

阿里巴巴云原生

阿里云 云原生 容器服务

CorelDRAW2023发布!详解七大新功能

茶色酒

CorelDraw2023

Tuxera NTFS2024免费版NTFS磁盘读写软件

茶色酒

Tuxera NTFS2024

CorelDRAW Graphics Suite2023最新中文版下载

茶色酒

cdr2023

当⻉借⼒阿⾥云落地云原⽣架构转型,运维降本、效率稳定性双升

阿里巴巴云原生

阿里云 云原生 云原生架构

世界读书日|华为阅读联合40余家伙伴推出精品书单

最新动态

【深入浅出Spring原理及实战】「源码调试分析」深入源码探索Spring底层框架的的refresh方法所出现的问题和异常

洛神灬殇

spring NPE 源码剖析 4月日更 问题分析

活动回顾|微服务x容器开源开发者 Meetup 成都站回放 & PPT 下载

阿里巴巴云原生

阿里云 开源 容器 微服务 云原生

预训练对话大模型深度解读

轻口味

AI 大模型 三周年连更

2023年3月用户体验GX评测:国有行及股份行持续领跑,城商行及农商行农信社积极探索实践用户体验体系搭建

易观分析

金融 银行

iMazing软件最新版有哪些新功能?

茶色酒

imazing

使用 Kubectl Patch 命令更新资源

Se7en

云原生

TypeScript Module

程序员海军

三周年连更

Django笔记十五之in查询及date日期相关过滤操作

Hunter熊

Python django 日期

【Python实战】Python对中国500强排行榜数据进行可视化分析

BROKEN

三周年连更

ChatGPT辅助编写自动化测试

QE_LAB

单元测试 自动化测试 接口测试 测试技术 ChatGPT

Docgeni 2.1 正式发布

PingCode研发中心

软件开发 Docgeni

CDR2023最新中文版下载安装详细教程

茶色酒

cdr2023

算法刷题-移除元素、分数到小数、整数转罗马数字

共饮一杯无

数据结构 算法 三周年连更

基于 Amazon SageMaker 构建细粒度情感分析应用

亚马逊云科技 (Amazon Web Services)

机器学习 Amazon SageMaker

  • 需要帮助,请添加网站小助手,进入 InfoQ 技术交流群
React Portals 简述及其用例_语言 & 开发_Madushika Perera_InfoQ精选文章