开发者问题收集

错误: useRoutes() 只能在 <Router> 组件的上下文中使用

2020-10-17
6646

我正在使用 System JS 动态添加 React 模块,效果很好!
除非我尝试使用已加载模块中的 react-router 上下文。

"react-router-dom": "6.0.0-beta.0"

您可以在 React 组件资源管理器中看到,肯定有一个 <Router> 组件作为祖先。
路由在主机应用程序中运行良好 - 仅当从动态加载的组件调用时才会中断。

我是 React 新手,所以我可能对如何向深度嵌套或动态加载的子项提供上下文做出了错误的假设。

在此处输入图像描述

路由器安装在此处 -
https://github.com/savantly-net/sprout-platform/blob/47cb99f7076bf6df09d9fec8e2d6c7ee78ce08af/frontend/apps/webapp/src/index.tsx#L204

模块正在此处加载 -
https://github.com/savantly-net/sprout-platform/blob/47cb99f7076bf6df09d9fec8e2d6c7ee78ce08af/frontend/apps/webapp/src/features/plugins/AppRootPage.tsx#L84

抛出异常的模块元素在这里 -
https://github.com/savantly-net/sprout-platform/blob/47cb99f7076bf6df09d9fec8e2d6c7ee78ce08af/backend/modules/forms/src/plugin/FormsRootPage.tsx#L47

2个回答

问题是由于模块包中存在 react-router-dom 库。
当动态模块加载时,它使用的是自己的库版本,而不是主机应用程序提供的版本。

我将其添加到我的 webpack/rollup 配置中的 externals ,问题就解决了。

我现在可以让主机应用程序内的插件管理子路由! =]。

Webpack -
https://github.com/savantly-net/sprout-platform/blob/e746085ebd65820fd449c968385913f2cc86ee0d/frontend/tools/sprout-toolkit/src/config/webpack.plugin.config.ts#L176

Jeremy
2020-10-18

<App /> 包装在 <Router> </Router> 内将解决此问题。

import { BrowserRouter as Router } from "react-router-dom";

<Router>
 <App/>
</Router>
Suprabhat Kumar
2021-12-25