I have setup the React with react-router
version 4. The routing works when I enter the URL directly on the browser, however when I click on the link, the URL changes on the browser (e.g http://localhost:8080/categories), but the content don't get updated (But if I do a refresh, it gets updated).
Below is my setup:
The Routes.js setup as follows:
import { Switch, Route } from 'react-router-dom';
import React from 'react';
// Components
import Categories from './containers/videos/Categories';
import Videos from './containers/videos/Videos';
import Home from './components/Home';
const routes = () => (
<Switch>
<Route exact path="/" component={Home}/>
<Route path="/videos" component={Videos}/>
<Route path="/categories" component={Categories}/>
</Switch>
);
export default routes;
The link I use in Nav.js are as follows:
<Link to="/videos">Videos</Link>
<Link to="/categories">Categories</Link>
The App.js is as follows:
import React from 'react';
import './app.scss';
import Routes from './../routes';
import Nav from './Nav';
class AppComponent extends React.Component {
render() {
return (
<div className="index">
<Nav />
<div className="container">
<Routes />
</div>
</div>
);
}
}
AppComponent.defaultProps = {
};
export default AppComponent;
I was having the exact same issue, but the cause of mine was much simpler.
In my case I had a space at the end of the URL string:
Wouldn't work when I clicked on the link, but the URL would update in the address bar. Tapping on the browser address bar and hitting the
enter
key would then work correctly.Removing the space fixed it:
Pretty obvious I guess, but easy to overlook. A few hairs were pulled before I noticed (and clearly I ended up here), hope it saves someone else a few hairs.
The order in which include the component is also important in your
index.js
file. BrowserRouter, Provider then the App.Wrapping your component with
withRouter
should do the job for you.withRouter
is needed for a Component that usesLink
or any otherRouter
props and doesn't receive theRouter props
either directly fromRoute
or from theParent Component
Router Props are available to the component when its called like
or
or if you are placing the
Links
as direct children of Router tag likeIn case when you wish to write the child content within Router as a component, like
The Router props won't be available to App and hence, you could pass call it using a Route like
However withRouter comes in Handy when you want to provide the Router props to a highly nested component. Check this solution
There should be only one ROUTER in the whole app, which I think if your head file is App.js, then the ROUTER should wrap the whole App.js component.
I was facing this because I have not installed the
react-router
in the application (package.json) dependencies...I would go through your components and make sure you have only one
<Router> ... </Router>
. Also -- make sure you have a<Router>...</Router>
There may be cases when you'd use more than one, but if you accidentally have nested routers (because you were hacking quickly and forgot to remove one when you were moving it around to all kinds of places ;-) - it could cause an issue.I would try
In your top most component (App.js).