错误:目标容器不是DOM元素。使用createPortal时,第二个参数必须是有效的DOM节点。
Error: Target container is not a DOM element. When using createPortal, the second argument must be a valid DOM node.
ID: react/portal-target-not-dom-element
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| React 16.0.0 | active | — | — | — |
| React 17.0.2 | active | — | — | — |
| React 18.2.0 | active | — | — | — |
根因分析
传递给ReactDOM.createPortal的第二个参数不是有效的DOM元素(例如null、undefined或字符串选择器),通常是因为目标元素尚未渲染或选择器不正确。
English
The second argument passed to ReactDOM.createPortal is not a valid DOM element (e.g., null, undefined, or a string selector), often because the target element hasn't been rendered yet or the selector is incorrect.
官方文档
https://react.dev/reference/react-dom/createPortal解决方案
-
Ensure the target DOM element exists before calling createPortal by using a ref or checking if the element is available in useEffect.
-
Define the target element in the HTML file (e.g., index.html) and ensure it's present before the React app mounts.
无效尝试
常见但无效的做法:
-
Using document.querySelector('#root') without checking if the element exists
70% 失败
If the DOM element is not yet mounted (e.g., in a component that renders before the target), querySelector returns null.
-
Passing a string like '#modal-root' directly to createPortal
90% 失败
createPortal expects a DOM element, not a CSS selector string. It will throw an error because a string is not a node.
-
Using document.getElementById inside a component that runs before the target is rendered
60% 失败
If the target div is defined in the same component's JSX, it may not exist in the DOM when the portal is created, leading to null.