Инвариантное нарушение: вы не должны использовать <switch> вне <router>
У меня проблема, что я не знаю, как решить, я получаю эту ошибку при запуске npm test 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>
);
}
};
Ответы
Ответ 1
Ошибка правильная. Вам нужно обернуть Switch
с BrowserRouter
или другими альтернативами, такими как HashRouter
, MemoryRouter
. Это связано с тем, что BrowserRouter
и его альтернативы являются общим низкоуровневым интерфейсом для всех компонентов маршрутизатора, и они используют API history
HTML 5, и вам это нужно для перемещения назад и вперед между вашими маршрутами.
Попробуй сделать это скорее
import { BrowserRouter, Switch, Route } from 'react-router-dom';
А затем заверните все так
<BrowserRouter>
<Switch>
//your routes here
</Switch>
</BrowserRouter>
Ответ 2
Всегда помещайте 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"))
Примечание: BrowserRouter принимает только один дочерний элемент.