'No routes matched location "/login"

all import statements

    import React, { useState } from 'react';
    import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
    import Dashboard from './components/Dashboard/Dashboard';
    import Preferences from './components/Preferences/Preferences';
    import Login from './components/Login/Login';

    import useToken from "./useToken";




  function App() {

token function for blocking pages before logging in

    const { token, setToken } = useToken();

login Route

 if (!token) {



    return( 
  <Router>
    <Routes>
      <Route path="/login">
        <Route
          index
          element={<Login setToken={setToken}
          />}
        />
      </Route>

    </Routes>
  </Router>
);
      }

after login routes return ( <Route path="/dashboard" element={}> <Route path="/preferences" element={}> ); } export default App;

What am i doing wrong ?



Solution 1:[1]

Don't conditionally render the routes, just render them normally. If you need to prevent access to certain routes do this with a specialized component wrapper or layout route.

return( 
  <Router>
    <Routes>
      <Route path="/login">
        <Route index element={<Login setToken={setToken} />} />
      </Route>
      <Route path="/dashboard" element={...} /> 
      <Route path="/preferences" element={...} />
    </Routes>
  </Router>
);

Example using conditional redirect on the token.

import { Outlet, Navigate, useLocation } from 'react-router-dom';

const AuthLayout = () => {
  const { token } = useToken();
  const location = useLocation();
  return token
    ? <Outlet />
    : <Navigate to="/login" replace state={{ from: location }} />
}

const AnonymousLayout = () => {
  const { token } = useToken();
  return token
    ? <Navigate to="/" replace />
    : <Outlet />
}

App

return( 
  <Router>
    <Routes>
      <Route element={<AnonymousLayout />}>
        <Route path="/login" element={<Login setToken={setToken} />} />
      </Route>
      <Route element={<AuthLayout />}>
        <Route path="/dashboard" element={...} /> 
        <Route path="/preferences" element={...} />
      </Route>
    </Routes>
  </Router>
);

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1