我在react-router-dom
应用程序中使用React
进行路由。我的部分应用程序在另一个包中提取。依赖项列表如下所示:
./app/dashboard/package.JSON
{
"dependencies": {
"@app/components": "^1.0.0",
"react": "^16.8.5",
"react-dom": "^16.8.5",
"react-router-dom": "^5.0.0"
}
}
./app/components/package.JSON
{
"peerDependencies": {
"react-router-dom": "^5.0.0"
}
}
当我使用来自@app/components
的组件需要来自react-router-dom
的组件时,我得到了这个错误:
Uncaught Error: Invariant failed: You should not use <Route> outside a <Router>
The above error occurred in the <Context.Consumer> component:
Uncaught (in promise) Error: Invariant failed: You should not use <Route> outside a <Router>
为什么抛出这个错误?在App.js
我使用BrowserRouter
import React, { Suspense } from 'react';
import { Switch, Route } from 'react-router-dom';
import { Placeholder } from '@app/components';
const Auth = React.lazy(() => import(/* webpackPrefetch: true */ './pages/Auth'));
const Index = React.lazy(() => import(/* webpackPrefetch: true */ './pages/Index'));
const App = () => (
<Suspense fallback={<Placeholder />}>
<Switch>
<Route path="/auth" component={Auth} />
<Route path="/" component={Index} />
</Switch>
</Suspense>
);
export default App;
client.jsx
import React from 'react';
import { render } from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import App from './App';
render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById('root'),
);
您还需要从Router
导入命名导出react-router-dom
并将其包装在Switch / Route组件周围。
const App = () => (
<Router>
<Suspense fallback={<Placeholder />}>
<Switch>
<Route path="/auth" component={Auth} />
<Route path="/" component={Index} />
</Switch>
</Suspense>
</Router>
);
2个React实例的麻烦
我通过从MyComponent中删除'react-router-dom'的依赖关系解决了这个神秘的错误。我删除了'node_modules / react-router-dom'和'package.json'我的应用程序结构如下:
AppFolder
├── README.md
├── build
├── node_modules
│ ├── react-router-dom
├── package-lock.json
├── package.json
├── public
│ ├── favicon.ico
│ ├── index.html
│ └── manifest.json
└── src
├── App.css
├── App.js
├── App.test.js
├── index.js
├── redux
│ ├── reducers.js
│ └── store.js
└── serviceWorker.js
MyComponent
├── README.md
├── dist
├── node_modules
│ ├── react-router-dom
├── package-lock.json
├── package.json
├── rollup.config.js
└── src
├── index.js
├── styles.css
└── test.js
这是App.js的源代码
import MyComponent from 'MyComponent'
export default App(){
return (
<div className="App">
<HashRouter>
<div>
<header className="App-header">
</header>
<Route path="/home" component={MyComponent}/>
</div>
</HashRouter>
</div>)
}
这是MyComponent的导出
export default withRouter(MyComponent);
如果“react-router-dom”保留在组件文件夹中,则会显示错误。
在document.getElementById('root')
之后,在渲染调用结束时有一个悬挂的逗号。
render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById('root'),
);