不变失败:你不应该使用 在外面

问题描述 投票:3回答:3

我在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'),
);
reactjs react-router react-router-dom
3个回答
0
投票

您还需要从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>
);

0
投票

2个React实例的麻烦


0
投票

我通过从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”保留在组件文件夹中,则会显示错误。


-1
投票

document.getElementById('root')之后,在渲染调用结束时有一个悬挂的逗号。

render(
  <BrowserRouter>
    <App />
  </BrowserRouter>,
  document.getElementById('root'),
);
© www.soinside.com 2019 - 2024. All rights reserved.