【发布时间】:2023-09-12 14:10:01
【问题描述】:
我正在创建一个Logger 服务来跟踪我的应用程序中的事件。为了使 Logger 服务通用,我使用 React 的 Portal 来捕获在我的应用程序中触发的事件。我的应用程序的基本思想是:
<LoggerPortal>
<App>
</LoggerPortal>
这对我的用例很有效,直到我在我的应用程序中使用了iFrame。
考虑一个渲染 iFrame 的非常简单的组件:
const Frame = props => {
const refiFrame = useRef(null);
useEffect(() => {
console.log(refiFrame.current.contentDocument);
}, []);
return (
<>
<iframe id="i-framed-you" title="original-iframe-title" ref={refiFrame} />
</>
);
};
现在,当我在上面渲染这个 Frame 组件而没有包裹它的 Portal 时,iframe.contentDocument 会按预期记录。
ReactDOM.render(<Frame />,rootElement)
但是当我渲染封装在 Portal 中的 Frame 组件时,iFrame.contentDocument 的值是 null。
ReactDOM.render(
<LoggerPortal>
<Frame />
</LoggerPortal>,
rootElement
);
这是一个codesandbox,它有一个描述我的问题的应用程序。有人在使用门户网站和 iFrame 时遇到过这个问题吗?我在这里遗漏了什么明显的东西吗?
【问题讨论】:
标签: javascript reactjs iframe react-hooks react-portal