Инвариантное нарушение: вы не должны использовать <Switch> вне <Router>

У меня проблема, которую я не знаю, как решить, я получаю эту ошибку при запуске теста npm

Invariant Violation: You should not use <Switch> outside a <Router>

В чем может быть проблема и как ее решить? Тест, который я провожу, - это стандартный app.test.js, который поставляется с response.

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>
    );
  }
};

Обратите внимание, что эта ошибка не имеет ничего общего с тем фактом, что вы запускаете модульный тест - вы также получите его во время выполнения.

Joe Clay 29.05.2018 15:00
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
69
1
77 110
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Ответ принят как подходящий

Ошибка правильная. Вам нужно обернуть SwitchBrowserRouter или другими альтернативами, такими как HashRouter, MemoryRouter. Это связано с тем, что BrowserRouter и альтернативы являются общим низкоуровневым интерфейсом для всех компонентов маршрутизатора, и они используют HTML 5 history API, и вам это нужно для перехода между вашими маршрутами.

Попробуй сделать это скорее

import { BrowserRouter, Switch, Route } from 'react-router-dom';

А потом все так завернуть

<BrowserRouter>
 <Switch>
  //your routes here
 </Switch>
</BrowserRouter>

Спасибо, что эта ошибка решена! Но теперь я получаю еще один ... Ошибка: Ошибка просмотра файла на предмет изменений: EMFILE в _errnoException (util.js: 1019: 11) в FSEvent.FSWatcher._handle.onchange (fs.js: 1360: 9) npm ERR! Тест не пройден. Подробнее см. Выше.

Fille_M 29.05.2018 15:08

@Fille_M Перезагрузите сервер разработки

casraf 29.05.2018 15:10

Да, попробуйте предложение @casraf

Siya 29.05.2018 15:32

<BrowserRouter /> должен быть </BrowserRouter>

Andy 13.03.2019 01:33

Для подключенного-реагирующего маршрутизатора он не работает :( github.com/supasate/connected-react-router

Nikhil Mahirrao 19.03.2019 07:41

Какую ошибку вы получаете? Также рассмотрите возможность публикации этого вопроса и поделитесь со мной ссылкой

Siya 19.03.2019 08:04

Наличие версии "react-router-dom": " ^5.0.0", Не работает при оборачивании с StaticRouter для рендеринга на стороне сервера. Хотя раньше он работал в 4.3.1.

master_dodo 14.04.2019 23:17

Вы проверили журнал изменений на предмет критических изменений

Siya 15.04.2019 07:41

Всегда помещайте BrowserRouter в компоненты навигации, следуйте примеру:

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 принимает только один дочерний элемент.

На самом деле BrowserRouter может принимать более одного дочернего элемента.

Maxim Mazurok 14.04.2019 00:59

Это многословно. Я нашел это полезным.

pankaj 23.06.2020 12:09

Я столкнулся с той же проблемой. Это разрешается, когда я «импортирую BrowserRouter из дома-реактора». и написать код

<BrowserRouter>
 <Switch>
  //your routes here
 </Switch>
</BrowserRouter>

Правильный способ справиться с этим, по мнению разработчиков React Router, - обернуть свой модульный тест в Router. Рекомендуется использовать MemoryRouter, чтобы иметь возможность перезагружать маршрутизатор между тестами.

Вы все еще можете сделать что-то вроде следующего:

<BrowserRouter>
  <App />
</BrowserRouter>

Затем в App:

<Switch>
  <Route />
  <Route />
</Switch>

Ваши модульные тесты для App обычно выглядят примерно так:

const content = render(<App />); // Fails Unit test

Обновите модульный тест до:

const content = render(<MemoryRouter><App /></MemoryRouter>); // Passes Unit test

Замечательно, спасибо, MemoryRouter был именно тем, чего мне не хватало!

Ioanna 29.05.2020 05:47

Вы не можете использовать response-router 4.3 с react-router-dom 4.4 или наоборот. (Обновлено: написать это так: почему это не считается критическим изменением?)

Убедитесь, что у вас будут одинаковые версии

Убедитесь, что у всех вложенных компонентов есть правильный импорт. Вы можете получить эту ошибку, если один из них импортирует Switch из response-router вместо response-router-dom. Сохранение всего согласованного с 'response-router-dom' (который в любом случае реэкспортирует компоненты реактивного маршрутизатора). Проверено:

"react-router": "^5.2.0",
"react-router-dom": "^5.2.0",

Вы должны написать свой код вот так

import {BrowserRouter, Switch, Router} from 'react-router-dom
 
 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>

     <BrowserRouter>
        <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>
      <BrowserRouter/>
      </div>
    );
  }
};

Я обновил зависимости с помощью yarn add react-router-dom или npm install react-router-dom, удалил папку node_modules и снова запустил yarn или npm install.

Error: Invariant failed: You should not use <Link>,<Switch>,<Route> outside a <Router>[][1]

[Error: Invariant failed: You should not use <Link>,<Switch>,<Route> outside a <Router> ][1]

 1. Open Index.js or Index.jsx
 2. add-> import { BrowserRouter } from "react-router-dom";
 3.Rap <App /> in <BrowserRouter> and </BrowserRouter> 
should  look like :
ReactDOM.render(
  <React.StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </React.StrictMode>,
  document.getElementById("root")
);

Этот вопрос уже содержит несколько ответов и принятый ответ. Можете ли вы объяснить (отредактировав свой ответ), чем ваш ответ отличается от других ответов? Также знайте, что ответы, содержащие только код, бесполезны в долгосрочной перспективе.

7uc1f3r 19.09.2020 10:59

я нашел решение для решения этой проблемы

вот пример кода

import React from 'react';
import Home from './HomeComponent/Home';
import { Switch, Route } from 'react-router';
import { BrowserRouter } from "react-router-dom";
class App extends React.Component{
render(){
return(
         <BrowserRouter>
           <Switch>
            <Route path = "/" render = {props => (
                <Home {...props}/>
            )}/>
          </Switch>
        </BrowserRouter>
    )
  }
}
export default App;

Мои NavLink и Route находятся в отдельных файлах, чтобы устранить эту ошибку, мне пришлось обернуть их оба в BrowserRouter:

import React from 'react';
import { NavLink, BrowserRouter } from 'react-router-dom'
const MainNav = () => (
  <BrowserRouter>
      <nav>
      <ul>
        <li>
          <NavLink exact activeClassName='current' to='/'>Home</NavLink>
        </li>
        <li>
          <NavLink exact activeClassName='current' to='/users'>Users</NavLink>
        </li>
      </ul>
    </nav>
  </BrowserRouter>
);


export default MainNav;

import React from 'react';
import { Switch, Route } from 'react-router-dom';
import Home from '../views/HomeView';
import UsersView from '../views/UsersView';
import { BrowserRouter } from 'react-router-dom';

const MainRoutes = () => (
  <BrowserRouter>
    <Switch>
      <Route exact path='/' component = {Home}></Route>
      <Route exact path='/users' component = {UsersView}></Route>
    </Switch>
  </BrowserRouter>
);

export default MainRoutes;`

Другие вопросы по теме