How to correct React Portal error: Target container is not a DOM element
How to correct React Portal error: Target container is not a DOM element
我在获取 React 门户网站时遇到问题。我不明白为什么我收到错误消息 portal id is not DOM element 这显然是一个有效的 DOM 元素。
我有一个沙盒here
此处提供了完整的代码。 console.log 正确报告元素是 DOM 元素,但 React 抛出错误。
import "./styles.css";
import { createPortal } from "react-dom";
import { useEffect, useState } from "react";
export default function App() {
const [portalDiv, setPortalDiv] = useState(undefined);
useEffect(() => {
let pd = document.getElementById("portalDiv");
console.log(pd);
setPortalDiv(pd);
}, []);
return (
<>
<div id="portalDiv">portal container</div>
<div className="app">
{/* {console.log("render portaldiv", portalDiv)} */}
{
(portalDiv &&
createPortal(
<>
<h1>Inside portal</h1>
</>
),
portalDiv)
}
<h1>Outside portal</h1>
</div>
</>
);
}
任何建议表示赞赏。谢谢
如我的评论所述,不推荐使用此用例,但这是一个可重现的示例。
如果您打算将 React 节点注入 VDOM,您应该为此使用 React API,这样您在查询 DOM 时就不会出现竞争条件通过 DOM API.
import "./styles.css";
import { createPortal } from "react-dom";
import { useRef } from "react";
export default function App() {
const containerRef = useRef();
return (
<>
<div ref={containerRef}>portal container</div>
<div id="app">
{containerRef.current &&
createPortal(<h1>Example Element</h1>, containerRef.current)}
<h1>Outside portal</h1>
</div>
</>
);
}
我在获取 React 门户网站时遇到问题。我不明白为什么我收到错误消息 portal id is not DOM element 这显然是一个有效的 DOM 元素。
我有一个沙盒here
此处提供了完整的代码。 console.log 正确报告元素是 DOM 元素,但 React 抛出错误。
import "./styles.css";
import { createPortal } from "react-dom";
import { useEffect, useState } from "react";
export default function App() {
const [portalDiv, setPortalDiv] = useState(undefined);
useEffect(() => {
let pd = document.getElementById("portalDiv");
console.log(pd);
setPortalDiv(pd);
}, []);
return (
<>
<div id="portalDiv">portal container</div>
<div className="app">
{/* {console.log("render portaldiv", portalDiv)} */}
{
(portalDiv &&
createPortal(
<>
<h1>Inside portal</h1>
</>
),
portalDiv)
}
<h1>Outside portal</h1>
</div>
</>
);
}
任何建议表示赞赏。谢谢
如我的评论所述,不推荐使用此用例,但这是一个可重现的示例。
如果您打算将 React 节点注入 VDOM,您应该为此使用 React API,这样您在查询 DOM 时就不会出现竞争条件通过 DOM API.
import "./styles.css";
import { createPortal } from "react-dom";
import { useRef } from "react";
export default function App() {
const containerRef = useRef();
return (
<>
<div ref={containerRef}>portal container</div>
<div id="app">
{containerRef.current &&
createPortal(<h1>Example Element</h1>, containerRef.current)}
<h1>Outside portal</h1>
</div>
</>
);
}