Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

React Router v4 routes not working

I am relatively new to reacts and I'm trying to figure out how to get React router to work. I've got a super simple test app that looks like this:

import React from 'react'; import ReactDOM from 'react-dom';  import {BrowserRouter as Router, Route, Switch, IndexRoute, Link} from 'react-router-dom';  const Home = () => <h1><Link to= "/about">Click Me</Link></h1> const About = () => <h1>About Us</h1>  const Test = () => (   <Router>     <Switch>     <Route path ="/" component = {Home} />     <Route path ="/about" component = {About} />     </Switch>   </Router> )  ReactDOM.render(<Test />, document.getElementById('app')); 

when I run the app the home component loads without any trouble, and when I click the "Click Me" link the url changes to localhost/about, however nothing happens. If I click refresh I get a "Cannot GET /about." Clearly I am doing something wrong but I haven't been able to figure out what. I am also using Webpack.

like image 427
WebbH Avatar asked Apr 17 '17 17:04

WebbH


People also ask

Why is redirect not working in React?

Conclusion # To solve the error "export 'Redirect' (imported as 'Redirect') was not found in 'react-router-dom'", use the Navigate component instead of Redirect , e.g. <Navigate to="/dashboard" replace={true} /> . The Navigate component changes the current location when it's rendered.

What is useParams() React?

The useParams hook returns an object of key/value pairs of the dynamic params from the current URL that were matched by the <Route path> . Child routes inherit all params from their parent routes.

What does useParams() returns?

useParams returns an object of key/value pairs of URL parameters. Use it to access match.

What is BrowserRouter?

BrowserRouter: BrowserRouter is a router implementation that uses the HTML5 history API(pushState, replaceState and the popstate event) to keep your UI in sync with the URL. It is the parent component that is used to store all of the other components.


1 Answers

You need to use an exact path for / otherwise it will also match /about.

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

As mentioned in the comments, for something this simple I would suggest using Create React App which will make sure your server code and your webpack settings are all correct. Once you use create-react-app you'll just need to use npm to install the react router v4 package, and then put your code above into the App.js file and it should work. There are some small changes to your code to get it to work with create-react-app as can be seen below:

// App.js import React from 'react';  import { BrowserRouter as Router, Route, Switch, Link } from 'react-router-dom';  const Home = () => <h1><Link to="/about">Click Me</Link></h1> const About = () => <h1>About Us</h1>  const App = () => (   <Router>     <Switch>       <Route exact path="/" component={Home} />       <Route path="/about" component={About} />     </Switch>   </Router> )  export default App; 

The quick start instructions from React Router V4 documentation will tell you pretty much the same as I just explained.

like image 56
Todd Chaffee Avatar answered Oct 24 '22 00:10

Todd Chaffee