简体   繁体   中英

React error: No routes matched location "/"

My React app is giving me the error No routes matched location "/"

My App.js looks like:

import Form from './components/Form';
import NavMenu from './components/NavMenu';
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';

function App() {

  // Irrelevant code
  
  return (
    <Router>
      <div>
        <NavMenu />
        <Routes>
          <Route path="/:nav_string" element={<Form />}></Route>
        </Routes>
      </div>
    </Router>
  );
}

export default App; 

Any thoughts why this is happening?

I got rid of the error, although it's not a clean solution. I created a new component Home.js, added it to App.js with a route of "/":

return (
  <Router>
    <div className="content">
      <NavMenu response={response}/>
      <Routes>
        <Route path="/" element={<Home />}></Route> // Added home element
        <Route path="/:nav_string" element={<Form response={response} />}></Route>
      </Routes>
    </div>
  </Router>
);

Although I'm not a big fan of this solution because Home.js returns null. I just created it to get rid of this warning. What can someone do if they don't actually need a route with a path matching /?

If you don't really need to render anything on the "/" path you could render a redirect to the form's route, perhaps with some default value.

Example:

return (
  <Router>
    <div className="content">
      <NavMenu response={response} />
      <Routes>
        <Route path="/" element={<Navigate to="/someDefaultValue" replace />} />
        <Route path="/:nav_string" element={<Form response={response} />} />
      </Routes>
    </div>
  </Router>
);

An alternative could also be to render the Form component on both routes. RRD is optimized such that the Form component remains mounted while navigating between the routes or while the nav_string param value changes.

Example:

return (
  <Router>
    <div className="content">
      <NavMenu response={response} />
      <Routes>
        <Route path="/" element={<Form response={response} />} />
        <Route path="/:nav_string" element={<Form response={response} />} />
      </Routes>
    </div>
  </Router>
);

Just make sure that Form can handle a potentially undefined nav_string param value. You could provide a fallback value.

const { nav_string = "someDefaultValue" } = useParams();

And then there is always the "catch all" route where you can render some fallback UI for any "unhandled" routes. This would include "/" .

Example:

return (
  <Router>
    <div className="content">
      <NavMenu response={response} />
      <Routes>
        <Route path="*" element={<NotFound />} />
        <Route path="/:nav_string" element={<Form response={response} />} />
      </Routes>
    </div>
  </Router>
);

You can add 404 route

Page not found will be displayed when no route matches the url

return (
  <Router>
    <div className="content">
      <NavMenu response={response}/>
      <Routes>
        <Route path="/:nav_string" element={<Form response={response} />}></Route>
        <Route path='*' element={<NotFound />} /> {/* You can change NotFound element*/}
      </Routes>
    </div>
  </Router>
);

the format for "/:nav_string" is a path parameter, there is no "/" path try type in for example "/Product" , then it solved

This should help:

<BrowserRouter>
 <NavMenu/>
   <Routes>
        <Route path="/" element={<Form/>}></Route>
   <Routes/>
<BrowserRouter/>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM