758

I don't know why I am getting this error and I can't find an answer for it anywhere. I have uninstalled the react-router-dom package and reinstalled it, but it continues to tell me that the switch module is not exported from react-router-dom. Here's my code.

The error I'm getting:

Attempted import error: 'Switch' is not exported from 'react-router-dom'.

Code

import React from 'react';
import './App.css';
import NavBar from './components/navbar.js';
import Footer from './components/footer.js';
import Home from './components/pages/homepage/home.js';
import { BrowserRouter as Router, Switch, Route, Link } from 'react-router-dom';

function App() {
  return (
    <Router>
      <div className="app-container">
        <NavBar />
        <Switch>
          <Route path="/home" component={Home} />
        </Switch>
        <Footer />
      </div>
    </Router>
  );
}

export default App;
2
  • might be a caching issue from a service worker. try ctrl+f5 or browsing in incognito mode Commented Jul 27, 2020 at 21:57
  • FYI: Here is the question regarding withRouter being not exported: stackoverflow.com/q/66465750/630364
    – yaobin
    Commented May 19, 2022 at 14:45

43 Answers 43

1366

In react-router-dom v6, "Switch" is replaced by routes "Routes". You need to update the import from

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

to

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

You also need to update the Route declaration from

<Route path="/" component={Home} />

to

<Route path='/' element={<Home/>} />

In react-router-dom, you also do not need to use the exact in the Route declaration.

For more information, you can visit the official documentation: upgrade to react-router-dom v6

8
  • 88
    Attention to the change Home to <Home/>, I didn't notice it at first look. Commented Nov 16, 2021 at 17:29
  • Also attention to Routes having exact, that prop was kind of removed. Commented Nov 22, 2021 at 18:33
  • 4
    Does anyone know the rationale for these changes to react-router-dom? Commented Jan 12, 2022 at 5:59
  • Oh, yeah! It perfectly answers the question. However, make sure to notice the change in component to 'element', otherwise will result in a silent warning in the browser console "Matched leaf route at location "/" does not have an element. This means it will render an <Outlet /> with a null value by default resulting in an "empty" page." Commented Mar 6, 2022 at 17:44
  • 1
    Componet does not work. Replace with element Commented Jun 3, 2022 at 2:14
250

If you are using react-router-dom v6, it looks like Switch has been replaced with Routes.

0
185

This is an example using react-router-dom V6

import React from 'react'
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'

import '../styles/global.css'

import Layout from '../containers/Layout'
import Home from '../pages/Home'
import Login from '../containers/Login'
import RecoveryPassword from '../containers/RecoveryPassword'
import NotFound from '../pages/NotFound'

const App = () => {
  return (
    <Router>
      <Layout>
        <Routes>
          <Route exact path="/" element={<Home/>}/>
          <Route exact path="/login" element={<Login/>}/>
          <Route exact path="/recovery-password" element={<RecoveryPassword/>}/>
          <Route path="*" element={<NotFound/>}/>
        </Routes>
      </Layout>
    </Router>
  );
}

export default App;
4
  • 5
    Within Route exact is throwing error @jean
    – Shanthi
    Commented Nov 18, 2021 at 11:36
  • 2
    This does not work for me. It says it cannot find "Routes". All the other bits import OK. react-router-dom i am using is 6.2.1 Commented Jan 11, 2022 at 5:32
  • If you use typescript you discover that exact is no longer need in v6 because it is default. Standard JavaScript just ignores the extra parameter but TypeScript will complain. Commented May 24, 2022 at 17:20
  • Missed BrowserRouter in my case Commented Oct 20, 2022 at 18:04
118

I also faced the same problem, and I searched towards the Internet so much, but I didn't get any answer according to my question.

So I uninstalled the version 6 of react-router-dom:

npm uninstall react-router-dom

And installed version 5.2.0 of react-router-dom:

npm install [email protected]
2
  • 1
    This work perfectly , among all the answer this is the easiest way of doing by downgrading react-router-dom to 5.2.0 , but in my opinion we need to know the new syntax as well . Thanks Commented Jun 3, 2022 at 19:23
  • Best to install latest v5 so you don't run into issues with React 18 and the React.StrictMode component, e.g. npm install react-router-dom@5.
    – Drew Reese
    Commented Nov 29, 2023 at 9:50
69

Syntax has changed

Old Syntax

import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";

<Switch>
    <Route path="/home" component={Home} />
</Switch>

New Syntax:

import { BrowserRouter as Router, Routes, Route, Link } from "react-router-dom";

<Routes>
    <Route path="/home" element={<Home/>} />
</Routes>
3
  • what about Redirect? Commented Apr 23, 2022 at 6:01
  • 4
    @AzharUddinSheikh They replaced Redirect with Navigate Commented Apr 28, 2022 at 19:56
  • 1
    I like that you are mention that the old syntax and the new one, that help me to under stand the changes Commented May 13, 2022 at 8:47
37

In react-router-dom v6, Switch has been replaced with Routes. Use this format:

import { BrowserRouter as Router, Routes, Route} from 'react-router-dom';

<Router>
    <Routes>
        <Route exact path="/" element={<component />} />
        <Route exact path="/path2" element={<component2 />} />
        <Route exact path="/path3" element={<component3 />} />
    </Routes>
</Router>
2
  • 1
    Talk about rescuing me in the nick of time. Thanks!
    – pdm
    Commented Jan 7, 2022 at 20:10
  • "react-router-dom": "^6.2.2" does not support prop component on Route Component. Commented Mar 23, 2022 at 14:20
33

If you are using version 6 of react-router-dom, use this

Also, please see here for reference : https://reactrouter.com/docs/en/v6/upgrading/v5#:~:text=single%20route%20config%3A-,//%20This%20is%20a%20React%20Router%20v6%20app,%7D,-This%20step%20is

// This is a React Router v6 app
import {
  BrowserRouter,
  Routes,
  Route,
  Link,
  Outlet
} from "react-router-dom";

function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="users" element={<Users />}>
          <Route path="me" element={<OwnUserProfile />} />
          <Route path=":id" element={<UserProfile />} />
        </Route>
      </Routes>
    </BrowserRouter>
  );
}

function Users() {
  return (
    <div>
      <nav>
        <Link to="me">My Profile</Link>
      </nav>

      <Outlet />
    </div>
  );
}
1
  • Component doesn't work but element does. This works for me in 2022. Commented Jun 3, 2022 at 2:15
20

I was able to fix it by changing from Switch to Routes. So you should have something like this:

<Routes>
  <Route path='/home' element={<Home/>} />
</Routes>

And also you need to change the import from Switch to Routes:

import { Routes, Route } from "react-router-dom";
16

react-router-dom has updated to version 6. Now they have renamed the <Switch/> component to <Routes/>. There are also many changes.

You should spend sometime to read the documentation. Here is the link for react-router-v6-doc.

1
15

<Switch> is replaced by <Routes>

Before:

import { Route, Switch} from 'react-router'

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

Now:

import { Route, Routes} from 'react-router'

<Router>
    <Routes>
        <Route />
        <Route />
    </Routes>
</Router>

Just use Routes instead of Switch.

0
14

Step 1: Upgrade to react 16.8+ and react-router-dom v5.2:

npm uninstall react-router-dom
npm install [email protected]

Step 2: Update the react-router-dom import statement.

Change import { Switch, Route } from "react-router-dom"; to:

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

Step 3: Upgrade the syntax and replace "Switch" with "Routes" and "component" with "element"

Change

<Switch>
    <Route path="/home" component={HomePage} />
</Switch>

to

<Routes>
    <Route path="/home" element={<HomePage/>} />
</Routes>

Alternatively you can also downgrade the react-router-version as suggested in other solutions.

However, rather than going backwards, I would suggest to upgrade to latest version of react-router-dom and its syntax.

11

Change from

import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";

<Switch>
    <Route path="/home" component={Home} />
</Switch>

to

import { BrowserRouter as Router, Routes, Route, Link } from "react-router-dom";

<Routes>
    <Route path="/home" element={ <Home />} />
</Routes>
1
  • Thanks, I was using an old application code with the new version and this was the issue.
    – Sanan Ali
    Commented Nov 25, 2023 at 15:45
10

Switch is exported from react-router and not react-router-dom (the same goes for Route I think).

4
  • React Router Dom has its own components and API reactrouter.com/web/guides/quick-start - here's a github issue to elaborate on the "differences" github.com/ReactTraining/react-router/issues/4648
    – kJs0
    Commented Jul 27, 2020 at 22:01
  • @kJs0 you are right, I forgot react-router-dom re-exports everything from react-router. Commented Jul 27, 2020 at 22:07
  • this actually did fix my error, i installed the react-router package and imported it via react-router, but now I am getting another error stating "Error: Invariant failed: You should not use <Switch> outside a <Router>", when my switch is definitely inside of a router? Lol
    – ajesamann
    Commented Jul 27, 2020 at 22:09
  • Make sure both version are exactly the same react-router & react-router-dom Commented Jul 27, 2020 at 22:20
10

I solved my error by changing the way I was rendering my routes to the use of the element.

To:

import React from "react";
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import { Home } from "./app";
import { Login, Register } from "./auth";
const R: React.FC = () => {
  return (
    <Router>
      <Routes>
        <Route path="/login" caseSensitive={false} element={<Login />} />
        <Route path="/register" caseSensitive={false} element={<Register />} />
        <Route path="/" caseSensitive={false} element={<Home />} />
      </Routes>
    </Router>
  );
};
export default R;

Basically before v6.*:

import React from "react";
import { BrowserRouter as Router, Route, Switch} from "react-router-dom";
import { Home } from "./app";
import { Login, Register } from "./auth";
const R: React.FC = () => {
  return (
    <Router>
      <Switch>
        <Route path="/login">
           <Login />
        </Route>
       <Route path="/register">
           <Register/>
        </Route>

       <Route path="/">
           <Home/>
        </Route>
      </Switch>
    </Router>
  );
};
export default R;

After v6.*

import React from "react";
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import { Home } from "./app";
import { Login, Register } from "./auth";
const R: React.FC = () => {
  return (
    <Router>
      <Routes>
        <Route path="/login" caseSensitive={false} element={<Login />} />
        <Route path="/register" caseSensitive={false} element={<Register />} />
        <Route path="/" caseSensitive={false} element={<Home />} />
      </Routes>
    </Router>
  );
};
export default R;
10

In react-router-dom v6 Switch is Replaced with Routes.

And component with element

{componentName} with {}

2
  • 1
    As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.
    – Community Bot
    Commented Mar 4, 2022 at 13:47
  • This is repeating previous answers, e.g. Sridhar Rajaram's answer. Commented Aug 19, 2022 at 1:02
9

You have to check npm package version first. To check, run npm info react-router-dom version.

If the package version is >= 6.0.0, you have to change

import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";

to

import { BrowserRouter as Router,Routes, Route, Link } from "react-router-dom";

And also have to change

<Route path="/home" component={Home} />

to

<Route path="/home" element={<Home/>} />
9

What is your react-router-dom version?

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

If it is above one then you need to remove node-modules and reinstall node-module using npm install --save.

0
9

Write <Routes> instead of <Switch>.

Run this in the terminal:

npm install --save react-router react-router-dom

This helped me. Or check file package.json and add the following right after "react-dom": "^17.0.2",:

 "react-router": "^6.0.0",
3
  • Thanks. Below is my code and work.
    – Peter Chen
    Commented Jan 27, 2023 at 21:41
  • import Navbar from './Navbar'; import Transcript from './Transcript'; import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'; function App() { return ( <div className="App"> <Navbar /> <div className="content"> <Router> <Routes> <Route path ="/" element={ <Transcript /> } /> <Route path ="/Transcript" element={ <Transcript /> } /> </Routes> </Router> </div> </div> ); } export default App;
    – Peter Chen
    Commented Jan 27, 2023 at 21:42
  • 3/24/2023 - this solution worked for me. Commented Mar 25, 2023 at 4:32
7

If you are using react-router-dom v6, you have to change Switch to Routes as given in the example below:

Instead of importing Switch, import { Switch, ... } from 'react-router-dom';

import Routes import { Routes, ...} from 'react-router-dom';

Then, instead of using component = {ComponentName}, use element={<ComponentName/>} as shown below:

import { Routes, Route, ...} from 'react-router-dom';
    .
    .
    .  
    <Routes>
      <Route exact path='/' element={<Home/>}></Route>
    </Routes>
7

If you are using version 6 of react-router-dom, then you need to update Switch with Routes. The below syntax worked for me:

import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import './App.css';
import Home from './components/Home';

function App() {
  return (
    <div>
      <Router>
        <Routes>
          <Route path="/" exact element={<Home />} />
        </Routes>
      </Router>
    </div>
  );
}

export default App;
7

I had the same issue. On the project terminal, type the following commands. You will not need to make any changes to your code.

  1. npm uninstall react-router-dom

  2. npm install [email protected]

1
  • 1
    I would never suggest to downgrade. Expecially not a major downgrade. Might be a quick fix but it's dirty.
    – BonisTech
    Commented Dec 26, 2021 at 16:59
6

Switch has been replaced by Routes.

Source from Update routing (react-router-dom syntax) #1386 (howtographql GitHub)

Enter image description here

5
import {
      BrowserRouter as Router,
      Routes,
      Route,
      Link
    } from "react-router-dom";
    
    function App() {
      return (
        <>
        <Router className="App">
          <Navbar/>
          <Routes>
            <Route path='/'>
    
            </Route>
          </Routes>
        </Router>
        </>
      );
    }
    
    export default App;
4

A solution:

Delete the node_modules folder. In the package.json file, change the react-router-dom version (version 6 in my case) to "react-router-dom": "^5.2.1"

Then in the terminal run:

npm install to install the dependencies and then run npm start to relaunch

4

If you are using a newer version of react-router-dom (for example, ^6.2.1 in my case) you should change <Switch> to <Routes> and use <Route> with the component={<SampleComponent />} parameter.

Particularly the code example below:

import { BrowserRouter as Router, Routes, Route} from 'react-router-dom';
import MyComponent from './containers/MyComponent';

export default function AppRoutes() {
    return (
        <Routes>
            <Route exact path="/" component={<MyComponent />}>
            </Route>
        </Routes>
    );
}
4

I solved the problem like this:

yarn add react-router-dom@5,3,0
4

In v6 of react-router-dom, Switch is depreciated and is replaced by routes Routes. change your the import statement like below

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

to

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

also change component to element in your <Route/

<Route path="/" component={Home} />

to

<Route path='/' element={<Home/>} />

In react-router-dom, you also do not need to use the exact in the Route declaration.

3

If you installed react-router and react-router-dom v6 beta, just uninstall like this:

npm uninstall --save react-router react-router-dom

And install it with this:

npm install --save react-router react-router-dom

It is going to install the latest version that is not beta.

Then we just need to restart Visual Studio Code or whichever text editor you handle it with.

3

This is actually not a problem with you or React or your code. It's just the updated version of react-router-dom. Replace the Switch by Routes.

That’s it. Just use Routes instead of Switch and it works fine.

3

In react-router-dom v6, the switch is replaced by the Routes. Below is the simple example to configure react-router-dom v6.

import * as React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

import Layout from './components/Layout';
import ProtectedRoute from './components/ProtectedRoute';
import LoginPage from './pages/LoginPage';
import WizardPage from './pages/WizardPage';
import RequestsPage from './pages/RequestsPage';

import './App.scss'

export class App extends React.Component {
    public render() {
        const sharedRouteProps = { exact: true, authenticationPath: '/login' };
        const wizardRouteProps = { ...sharedRouteProps, path: "/", component: WizardPage };
        const requestsRouteProps = { ...sharedRouteProps, path: "/requests", component: RequestsPage };

        return (
            <Layout>
              <Router>
                <Switch>
                    <Route exact path='/login' component={LoginPage} />
                    <ProtectedRoute {...wizardRouteProps} />
                    <ProtectedRoute {...requestsRouteProps} />
                </Switch>
              </Router>
            </Layout>
        );
    }
}

Not the answer you're looking for? Browse other questions tagged or ask your own question.