javascript - 将 React 应用程序的一部分弹出到新窗口中
问题描述
我有一个看起来像这样的组件:
我希望能够在新窗口中加载它。我已经查阅了其他答案和相关文章,并且能够让 dom 树在门户中呈现,但不是更多。
onMouseEnter
例如不会在新窗口中触发。- 我
react-tippy
似乎在全球范围内做了一些自动的事情,这似乎不起作用/导致新窗口出现问题 - 我有一个由three.js 管理的webgl 画布。它也有点自动化,因为它不是由 react 管理的,而是位于
<body>
并覆盖整个窗口。React 将“视图”管理到这个画布中。
我正在努力理解应该如何处理。例如,这就是我的ReactDOM.render
电话的样子:
const webglViewManager = new WebGLViewManager()
const threeRenderer = new ThreeRenderer(webglViewManager)
render(
<ThreeContext.Provider value={{ webglViewManager, threeRenderer }}>
<Provider store={store}>
<ReactApp store={store} />
</Provider>
</ThreeContext.Provider>,
document.getElementById('main')
)
我试图将一个文档(我正在使用的那个,或者来自弹出窗口的那个)传递给我的三个上下文,让它在那里附加一个画布,但这似乎并不奏效。总的来说,我什至不敢尝试这个,因为我觉得我在推理这一切都是错误的。
使用这些相对复杂的系统(tippy mounts,three.js 的方式)和分布在多个窗口的门户,我可以获得多少里程?仅制作一个单独的“应用程序”以加载到另一个窗口中是否更有意义,如果是这样,那将如何实现?加载相同的入口点,但路由到这个视图,另一个应用程序......?
解决方案
我已经成功通过window.open
. 我发现有用的是创建一个窗口上下文,即:
import { createContext, useContext } from 'react'
export const WindowContext = createContext<Window | null>(null as any)
export const useWindowContext = () => useContext(WindowContext)
并将此提供程序放在我的新窗口周围。我不得不更改所有安装到新窗口主体的门户,但到目前为止这似乎工作正常。
推荐阅读
- node.js - 我如何在 Nodejs 中处理 Angular 404 请求
- python - 在 Raspberry Pi 上安装 mitmproxy 时出现 python 问题
- java - JAVA中的简单CSV文件比较
- c# - 通过自定义 DNS 服务器路由应用程序 Internet 访问
- python - 如何在 Docker 中运行 flask_migrate
- python - 带有 URL 的 xlsxwirter 合并范围
- css - CSS 变量与 CSS 模块 @value
- google-cloud-platform - 有没有办法从 pubsub 消息存储中删除消息?
- spring-boot - 无法在 Spring Boot thymeleaf 中将数据插入数据库
- pdf - 想要将 Java 类转换为 C# 类 Xamarin Android