Portal 是 React 提供的 ReactDOM.createPortal API,用于将子组件脱离当前 DOM 树、挂载到指定容器(如 body)中渲染,保持上下文与事件冒泡正常,仅改变 DOM 位置。
JavaScript 实现 Portal 的核心是 脱离当前 DOM 树、挂载到指定容器(如 body 或独立 div)中渲染
子组件,常用于模态框、Tooltip、全局通知等需要“穿透层级”或“脱离布局流”的场景。它本身不改变组件逻辑,只改变渲染位置。
Portal 是 React 提供的原生能力(ReactDOM.createPortal),不是浏览器标准或通用 JS 模式。纯 JavaScript(非 React)中没有内置 Portal 概念,但可模拟类似行为:手动创建元素、插入到目标容器、同步状态与事件。
ReactDOM.createPortal(child, container),返回一个 React Nodedocument.getElementById('modal-root'))React 并不真的“移动”已有 DOM,而是在 commit 阶段将 Portal 子树的 fiber 节点关联到目标 container,并由 ReactDOM 直接调用 appendChild / insertBefore 等原生 API 把生成的 DOM 插入指定位置。
若不用 React,想实现类似效果,本质是:动态创建 DOM、挂载、绑定事件、响应数据变化。
放在 底部renderToPortal(htmlString, target = '#portal-root')
document.querySelector(target).innerHTML = htmlString(简单版)document.createElement + element.addEventListener 手动管理事件和状态,配合模板字符串或轻量模板引擎Portal 容易忽略但关键的细节:
基本上就这些。Portal 不是魔法,只是把渲染输出重定向;它的价值在于解耦渲染位置与组件结构,让 UI 更灵活可控。