Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

React Router V4 is updating URL, but not refreshing (React, Redux)

I am trying to use React-Router V4 to add routes to my app, but it is not working at all. Basically, I'm trying to programatically change the route with history.push, which is updating the browser URL, but not changing anything inside the actual app.

NOTE: I am using redux.

The only answered question on this issue is:

React history.push() is updating url but not navigating to it in browser

However, I've tried the answer to the above question, and it doesn't work for me.

Here are the important snippets:

Topmost file (index.js)

...
ReactDOM.render(
    <BrowserRouter>
        <Provider store={store}>
            <App/>
        </Provider>
    </BrowserRouter>
    , document.getElementById('root'));
...

Component containing routes

...
export default function ContentRouter() {
    return <div className="content">
        <Route exact path="/dashboard" component={TmpDashboard}/>
        <Route exact path="/" component={() => {
            return <h1>Home</h1>
        }}/>
    </div>
}

Component pushing routes

...
this.handleGroupClick = (group) => {
    this.props.history.push(`/groups/${group}`);
    this.props.onOpenChange(false);
};
...
export default withRouter(connect(mapStateToProps, mapDispatchToProps(DrawerConnector))
like image 447
sunny-lan Avatar asked Jun 18 '17 22:06

sunny-lan


People also ask

Does Redux work with react router?

Redux is a predictable state container designed to help you write JavaScript apps that behave consistently across client, server, and native environments and are easy to test. While it's mostly used as a state management tool with React, you can use it with any other JavaScript framework or library.

How do you refresh a route in react?

import React from 'react'; function App() { function refreshPage() { window. location. reload(false); } return ( <div> <button onClick={refreshPage}>Click to reload!


1 Answers

After a lot of searching in the completely wrong place, I figured out what was wrong. The lack of updating was being caused by Redux

Whenever a component is wrapped in connect it causes updates to be blocked, and the view doesn't update.

The solution is mentioned here:

https://github.com/ReactTraining/react-router/issues/4671#issuecomment-285320076

Basically, every component with a Route or a React-Router thing inside it must be wrapped with withRouter

EDIT: Only the top level component that uses connect should be wrapped in withRouter. Note that this may cause performance issues

EDIT: The way I got around the increased coupling was to have a component just to deal with routes. That way, I only need to wrap that component, and the component with a Router.

like image 187
sunny-lan Avatar answered Nov 16 '22 01:11

sunny-lan