React Router work on reload, but not when clicking on a link

Viewed 25791

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;
9 Answers

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 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:

<Link to={ "/myentity/" + id + "/edit " } >Edit</Link>

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:

<Link to={ "/myentity/" + id + "/edit" } >Edit</Link>

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.

If anyone is using the history package for navigation and if you are using the react-router v5, then you may have to downgrade the history package to 4.10.1 until the history package developers issue a new release with the fix. As of writing this, the latest release version of history package is v5.0.1, and if you see a new release than this, you can try with that version first to see if it works, before doing the downgrade to 4.10.1

I was facing this because I have not installed the react-router in the application (package.json) dependencies...

You should not wrap the nav-bar where your are stored in or

I also had the same issue before. The mistake was the I wrapped my navbar component inside a you should use in the main component only (App.js)

React router dom v6 you need to wrap Navbar component inside router

      <Router>
        <Nav />
        <Routes>
          <Route exact path="/" element={<LandingPage />} />
          <Route exact path="projects" element={<Projects />} />
          <Route exact path="about" element={<About />} />
          <Route exact path="blog" element={<Blog />} />
        </Routes>
      </Router>
      <Footer />
Related