281

I am getting the following error when running npm run start in the terminal.

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

I have reinstalled node_modules, react-router-dom, react-router. Also restarted the terminal and my computer, but the issue persists.

My code:

import React from 'react'; import { Switch, Redirect } from 'react-router-dom'; import { RouteWithLayout } from './components'; import { Minimal as MinimalLayout } from './layouts'; import { Login as LoginView, Dashboard as DashboardView, NotFound as NotFoundView } from './views'; const Routes = () => { return ( <Switch> <Redirect exact from="/" to="/dashboard" /> <RouteWithLayout component={routeProps => <LoginView {...routeProps} data={data} />} exact layout={MinimalLayout} path="/login" /> <Redirect to="/not-found" /> </Switch> ); }; export default Routes; 

Here is my package.json imports:

"react-router": "^6.0.0-beta.0", "react-router-dom": "^6.0.0-beta.0", 
1
  • 11
    To keep everyone on their toes, react-router breaks compatibility with everything every now and then ;) Commented Nov 19, 2021 at 18:54

14 Answers 14

429

For react-router-dom v6, simply replace Redirect with Navigate

import { Navigate } from 'react-router-dom'; . . . { component: () => <Navigate to="/404" /> } 
Sign up to request clarification or add additional context in comments.

3 Comments

The Navigate documentation says it's a wrapper around useNavigate, whose doc page says "Important: It's usually better to use redirect in loaders and actions than this hook". That's all for main(6.4.3). So are those doc bugs?
@Sigfried redirect documentation says that it is equivalent to changing the route with 302 status. So it can't be used for navigating the application.
Thanks. Using <Navigate /> was bothering me while trying to debug some other problem and the component that (sometimes) returned <Navigate... /> was re-rendering once or twice before the url changed. Anyway, I fixed the bug, sweeping the annoyance under the rug.
110

Redirect has been removed from v6. You can replace Redirect with Navigate.

import { BrowserRouter as Router, Routes, Route, Navigate, } from 'react-router-dom'; import Home from '../home/Home'; export default function App() { return ( <Router> <Routes> <Route path="/home" element={<Home />} /> <Route path="/" element={<Navigate replace to="/home" />} /> </Routes> </Router> ); } 

Comments

42

Redirect component has been removed from the react-router version 6.

From react router docs:

The <Redirect> element from v5 is no longer supported as part of your route config (inside a ). This is due to upcoming changes in React that make it unsafe to alter the state of the router during the initial render. If you need to redirect immediately, you can either a) do it on your server (probably the best solution) or b) render a <Navigate> element in your route component. However, recognize that the navigation will happen in a useEffect.


If you want to use Redirect component, you will have to use react router version 5.

Alternatively, you can use Navigate component from react router v6. A <Navigate> element changes the current location when it is rendered

import { Navigate } from "react-router-dom"; return ( <Navigate to="/dashboard" replace={true} /> ) 

Note: Navigate is a component wrapper around useNavigate hook. You can use this hook to change routes programmatically.

1 Comment

Alternative to Redirect in react-router-dom v 6 is Navigate. Example: -- <Redirect to='/' /> to <Navigate replace to="/" /> Reference Link: reactrouter.com/docs/en/v6/api#navigate
19

Redirect have been removed from v6 but you can do it like that right now :

<Route path="*" element={<Navigate to ="/" />}/> 

1 Comment

This worked like a charm!! Actually am not using switch statement , so anything other than above solution doesn't work
15

In react-router-dom version 5.x.x > 6 we can use <Redirect />

import { Redirect } from 'react-router-dom'; { component: () => <Redirect to="/dashboard" /> } 

In react-router-dom version 5.x.x < 6 we can use <Navigate />

import { Navigate } from 'react-router-dom'; { component: () => <Navigate to="/dashboard" /> } 

Comments

12

switch Redirect into Navigate, it will work.

<Route path='/' exact> <Navigate to={`/documents/${uuidV4()}`} /> </Route> 

1 Comment

Can NOT be used when you have multiple Routes wrapped in a Routes
11

Redirect component has been removed from the react-router version 6, For react-router-dom v6, simply replace Redirect with Navigate

import { Navigate } from 'react-router-dom'; <Routes> <Route path="/login" element={isLogin ? <Navigate to="/" /> : <Login />}/> </Routes> 

Comments

11

You can't use the Redirect component because it has been removed from react-router-dom version 6.

You can use react-router-dom version 4.2.2. Just use the code below to install it.

npm install --save [email protected] 

or

yarn add [email protected] 

Comments

8

For versions 6.X you must use the hook useNavigate.

1 Comment

I believe this only applies to functional components, no?
5
import { Routes, Route , Navigate } from "react-router-dom"; return ( <Routes> <Route path='/products/:id' element={<Store/>} /> //replace Redirect with Navigate <Route path="*" element={<Navigate to ="/products" />}/> </Routes> ); 

Comments

5

Hi I remembered there was a hook called useHistory, this hook still exist, this only have a few changes and was renamed to useNavigate. Using this and following one of the examples from the documentation, I did this rework for my protected routes:

import { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { useAuth } from "../../contexts/AuthContext"; function ProtectedRoutes({ component: Component }, props) { const [loading, setLoading] = useState(true); const { currentUser } = useAuth(); const navigate = useNavigate(); useEffect(() => { if (currentUser) { setLoading(false); return; } navigate("/"); }, []); return <>{loading ? "Loading..." : <Component {...props} />} </>; } export default ProtectedRoutes; 

And in my Routes this is used like this:

import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; import AuthFirebaseHelper from "./helpers/AuthFirebaseHelper/AuthFirebaseHelper"; import ProtectedRoutes from "./helpers/ProtectedRoutes/ProtectedRoutes"; import Dashboard from "./components/Dashboard"; import Home from "./components/Home"; function App() { return ( <Router> <Routes> <Route path="/authentication" element={<AuthFirebaseHelper />}></Route> <Route path="/" exact element={<Home />}></Route> <Route path="/restricted" element={<ProtectedRoutes component={Dashboard} />} ></Route> </Routes> </Router> ); } 

export default App;

The documentation for useNavigation

Comments

4

As it is removed in v6, you can use this as an alternative.

<Route path="*" element={<NotFound />} /> 

Comments

0

I wanted to call it from a function, and useNavigate was giving me problems for not being called from a component.

My site uses a context to hold drawers, so that drawers are always written to the same point and can stack if I want them to.

I added another property, commands

if (responseData.page?.url) { MyContext.command.make(<Navigate to={responseData.page.url />); setTimeout(()=>MyContext.command.clear(), 1500) } 

command.clear() just calls setCommand(null), so I'm able to call this from components and functions alike, without React complaining about it like it does with useNavigate.

Comments

-2

Actually switch and redirect is the routers defined jn react-router version 5 and currently react-router version 6 so this will not word either You used version 5 with switch and redirect or routers and to with version 6

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.