打开一个新的 React Portal 只会打开一个没有内容的空页面

Opening a new React Portal only opens an empty page with no content

我正在尝试打开 React 门户,但我遇到了一些问题:

这是打开按钮所在的位置:

return (
    <div id="mainContent">
        <table>
            <td> <button onClick={() => { setIsPortalOpen(!isPortalOpen); }}>{row.original.title}</button> </td>
        </table>

        {isPortalOpen && (
            <Window>
                <MyPortal />
            </Window>
        )}
    </div>
)

当我单击该按钮时,确实会打开 window,但它是空白的并且只显示标题:"A react portal window"

并且只包含一个空 div: div="window-container">

这是包含 Portal 的函数:

const [isPortalOpen, setIsPortalOpen] = useState(false);

function MyPortal() {
    return ReactDOM.createPortal(
        <div id="portal_ProjectDetails">
            <div>Project Details</div>
            <div>HEY THERE THIS IS A TEST OF THE PORTAL SYSTEM</div>
        </div>,
        document.body
    )
}

这是 Window.js 的代码:

import React from "react";
import ReactDOM from "react-dom";

export default class Window extends React.Component {
constructor(props) {
    super(props);
    this.state = { win: null, el: null };
}

componentDidMount() {
    let win = window.open("", "", "width=600,height=400,");
    win.document.title = "A React portal window";
    let el = document.createElement("div");
    el.id = "window-container";
    win.document.body.appendChild(el);
    this.setState({ win, el });
}

componentWillUnmount() {
    this.state.win.close();
}

render() {
    const { el } = this.state;
    return el ? ReactDOM.createPortal(this.props.children, el) : null;
}

}

正如我所说,当我单击按钮时 window 确实打开了,但它是空的。

另外,当我点击按钮时,parent 页面的最底部会出现以下内容:

        <div id="portal_ProjectDetails">
            <div>Project Details</div>
            <div>HEY THERE THIS IS A TEST OF THE PORTAL SYSTEM</div>
        </div>

这是我的 index.js:

ReactDOM.render(
    <React.Fragment>
        <MainProjects />
        <div id="portal-root"></div>
    </React.Fragment>,
    document.getElementById('root')
)

但这就是我想在 Portal 中显示的内容 window。

所以我不太清楚为什么会这样。

我能做些什么来解决这个问题吗?

谢谢!

而不是在 body 上创建门户。在你的 index.html 中创建一个新的 div 并给它一个 id

<div id="portal-root"></div>

并将您的 MyPortal 组件更改为此

const [isPortalOpen, setIsPortalOpen] = useState(false);
const portalRoot = document.getElementById('portal-root')
function MyPortal() {
    return ReactDOM.createPortal(
        <div id="portal_ProjectDetails">
            <div>Project Details</div>
            <div>HEY THERE THIS IS A TEST OF THE PORTAL SYSTEM</div>
        </div>,
        portalRoot
    )
}

那么在你的情况下发生的事情是你正在安装在 body 上,它删除了所有 ui 以及 React 的主根 div.