React前端面试每日一试 8.什么是React Portals?

在React中,Portals 是一种技术,允许你将组件的子节点 渲染到父组件DOM层次结构之外的DOM 节点中。通常,React组件会按照嵌套结构渲染其子节点,但在某些情况下,我们希望将组件内容放置在DOM的其他位置,比如模态框工具提示弹出菜单等。React Portals正是为这种需求提供了解决方案。

为什么使用React Portals?

当我们需要将组件内容渲染在特定的DOM节点中,但这个节点不在父组件的DOM树内时,Portals提供了理想的方式。例如,当我们需要在页面的顶部渲染一个模态框,而模态框的触发按钮却在页面的底部。传统的嵌套方式可能会受到CSS的z-index、overflow属性等限制,而使用Portals可以轻松地将模态框渲染到根节点或者其他不受限制的位置。

如何使用React Portals?

使用React Portals非常简单。你只需调用 ReactDOM.createPortal (child, container) 方法,其中 child 是要渲染的React节点,container 是你希望渲染内容的DOM节点。

javascript 复制代码
import ReactDOM from 'react-dom';

function Modal({ children }) {
  return ReactDOM.createPortal(
    <div className="modal">
      {children}
    </div>,
    document.getElementById('modal-root') // 将内容渲染到 #modal-root 节点
  );
}

在上面的例子中,Modal 组件中的内容将被渲染到 #modal-root 这个DOM节点中,而不是嵌套在其父组件的DOM结构中。

使用场景

  1. 模态框 (Modal)
  2. 工具提示 (Tooltip)
  3. 弹出菜单 (Dropdown Menu)

这些场景通常需要突破父组件的DOM边界,使其在页面的其他部分渲染,React Portals为此提供了一个优雅的解决方案。

注意事项

虽然Portals允许组件在视觉上脱离父组件,但事件冒泡仍然会遵循React的组件树结构。也就是说,即使组件通过Portal渲染到不同的DOM节点中,其事件仍然会向上传递到父组件。

事件冒泡示例场景

例如,有一个通过Portal渲染的模态框组件,当你在模态框内部点击一个按钮时,尽管这个模态框的DOM结构在页面的顶层(例如body下),但事件冒泡路径还是会从子组件到父组件(即原来的React组件树结构),而不会直接跳过中间的React组件

总结

React Portals 是一种强大的工具,尤其在处理UI组件时,使你能够灵活地管理DOM节点的渲染位置,而不受限于React组件树的嵌套关系。通过合理使用Portals,你可以更轻松地构建复杂的UI组件,提高应用的用户体验.

PS:但事件冒泡仍然会遵循React的组件树结构.

相关推荐
美狐美颜sdk2 小时前
跨平台直播美颜sdk集成攻略:Android、iOS与Web的统一方案
android·前端·ios
Airser2 小时前
npm启动Taro框架报错
前端·npm·taro
Anlici3 小时前
连载小说大学生课设 需求&架构
前端·javascript·后端
2501_938769994 小时前
React Server Components 进阶:数据预取与缓存
前端·react.js·缓存
蒜香拿铁5 小时前
Angular【基础语法】
前端·javascript·angular.js
xiaoxiao无脸男5 小时前
纯css:一个好玩的按钮边框动态动画
前端·css·css3
rookie_fly5 小时前
基于Vue的数字输入框指令
前端·vue.js·设计模式
元直数字电路验证6 小时前
ASP.NET Core Web APP(MVC)开发中无法全局配置 NuGet 包,该怎么解?
前端·javascript·ui·docker·asp.net·.net
rexling16 小时前
【Spring Boot】Spring Boot解决循环依赖
java·前端·spring boot
我有一棵树6 小时前
Vue 项目中全局样式的正确写法:不要把字体和主题写在 #app 上
前端·javascript·vue.js