Fil*_*e_M 28 javascript reactjs react-router
我有一个问题,我不知道如何解决,我在运行npm测试时遇到此错误Invariant Violation: You should not use <Switch> outside a <Router>.问题是什么,我该如何解决?我运行的测试是带有反应的标准app.test.js
class App extends Component {
render() {
return (
<div className = 'app'>
<nav>
<ul>
<li><Link exact activeClassName="current" to='/'>Home</Link></li>
<li><Link exact activeClassName="current" to='/TicTacToe'>TicTacToe</Link></li>
<li><Link exact activeClassName="current" to='/NumGame'>Quick Maths</Link></li>
<li><Link exact activeClassName="current" to='/HighScore'>Highscore</Link></li>
<li><Link exact activeClassName="current" to='/Profile'>Profile</Link></li>
<li><Link exact activeClassName="current" to='/Login'>Sign out</Link></li>
</ul>
</nav>
<Switch>
<Route exact path='/' component={Home}></Route>
<Route path='/TicTacToe' component={TicTacToe}></Route>
<Route path='/NumGame' component={NumberGame}></Route>
<Route path='/HighScore' component={HighScore}></Route>
<Route path='/Profile' component={Profile}></Route>
<Route path='/Login' component={SignOut1}></Route>
</Switch>
</div>
);
}
};
Run Code Online (Sandbox Code Playgroud)
Siy*_*iya 59
错误是正确的.你需要用的Switch同BrowserRouter状或其他替代品HashRouter,MemoryRouter.这是因为BrowserRouter它的替代品是所有路由器组件的通用低级接口,并且它们使用HTML 5 historyAPI,您需要在您的路由之间来回导航.
试着这样做
import { BrowserRouter, Switch, Route } from 'react-router-dom';
Run Code Online (Sandbox Code Playgroud)
然后包装这样的一切
<BrowserRouter>
<Switch>
//your routes here
</Switch>
</BrowserRouter>
Run Code Online (Sandbox Code Playgroud)
小智 10
根据 React Router 开发人员的说法,处理这个问题的正确方法是将您的单元测试包装在路由器中。使用MemoryRouter是为了建议能够重置路由器测试之间。
您仍然可以执行以下操作:
<BrowserRouter>
<App />
</BrowserRouter>
Run Code Online (Sandbox Code Playgroud)
然后在App:
<Switch>
<Route />
<Route />
</Switch>
Run Code Online (Sandbox Code Playgroud)
您的单元测试App通常类似于:
const content = render(<App />); // Fails Unit test
Run Code Online (Sandbox Code Playgroud)
将单元测试更新为:
const content = render(<MemoryRouter><App /></MemoryRouter>); // Passes Unit test
Run Code Online (Sandbox Code Playgroud)
确保所有嵌套组件中都有正确的导入。如果其中之一从react-router而不是react-router-dom导入Switch,你可能会得到这个错误。保持一切与“react-router-dom”一致(无论如何都会重新导出react-router组件)。检查过:
"react-router": "^5.2.0",
"react-router-dom": "^5.2.0",
Run Code Online (Sandbox Code Playgroud)
小智 5
始终将 BrowserRouter 放在 navegations 组件中,请遵循示例:
import React, { Component } from 'react'
import { render } from 'react-dom'
import { BrowserRouter, Route, NavLink, Switch } from 'react-router-dom'
var Componente1 = () => (<div>Componente 1</div>)
var Componente2 = () => (<div>Componente 2</div>)
var Componente3 = () => (<div>Componente 3</div>)
class Rotas extends Component {
render() {
return (
<Switch>
<Route exact path='/' component={Componente1}></Route>
<Route exact path='/comp2' component={Componente2}></Route>
<Route exact path='/comp3' component={Componente3}></Route>
</Switch>
)
}
}
class Navegacao extends Component {
render() {
return (
<ul>
<li>
<NavLink to="/">Comp1</NavLink>
</li>
<li>
<NavLink exact to="/comp2">Comp2</NavLink>
</li>
<li>
<NavLink exact to="/comp3">Comp3</NavLink>
</li>
</ul>
)
}
}
class App extends Component {
render() {
return (
<BrowserRouter>
<div>
<Navegacao />
<Rotas />
</div>
</BrowserRouter>
)
}
}
render(<App/>, document.getElementById("root"))
Run Code Online (Sandbox Code Playgroud)
注意: BrowserRouter 只接受一个子元素。
| 归档时间: |
|
| 查看次数: |
28498 次 |
| 最近记录: |