Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I've read many things about react-router v4 and the npm history library to this point, but none seems to be helping me.

My code is functioning as expected up to the point when it should navigate and do a simple redirect when the url is changed using the history.push() method. The URL IS changing to the specified route, but not doing the redirect on the button push. Thanks in advance, still learning react-router...

I would like for the button push to do a simple redirect without the {forceRefresh:true}, which then reloads the whole page.

import React from 'react'; import createBrowserHistory from 'history/createBrowserHistory';  const history = createBrowserHistory({forceRefresh:true});  export default class Link extends React.Component {   onLogout() {     history.push("/signup");   }   render() {       return(         <div>           <h1>Your Links</h1>           <button onClick={this.onLogout.bind(this)}>Log Out</button>         </div>       )   } } 
like image 544
John Avatar asked Mar 22 '17 02:03

John


People also ask

Does history push change URL?

First, history. push() does not trigger navigation; it was observed that history. push() updated the browser's url but does not navigate to the path. Learn more about the issue here.

How redirect new URL in React JS?

Use the window. location. replace() method to redirect to an external url in React, e.g. window.


Video Answer


2 Answers

You shouldn't need to downgrade to v3, React-Router 4.0.0 is totally capable of accomplishing what the OP asked for.

const history = createBrowserHistory(); 

is a custom history object so you should use <Router> to synchronize it with react-router instead of <BrowserRouter>, which is what I assumed you were using.

Try this instead:

import React, {Component} from 'react'; import { Router } from 'react-router'; import { Route } from 'react-router-dom'; import createHistory from 'history/createBrowserHistory';  const history = createHistory();     class App extends Component {    constructor(props){       super(props);    }      render(){        return (            <Router history={history}>   //pass in your custom history object                 <Route exact path="/" component={Home} />                 <Route path="/other" component={Other} />            <Router />        )    } } 

Once your custom history object is passed in via Router's history prop, history.push should work just as expected in anywhere of your app. (you might want to put your history object in a history config file and import it into places where you want to route programmatically).

For more info, see: React Router history object

like image 167
Tina Chen Avatar answered Sep 27 '22 18:09

Tina Chen


Check if you don't have nested BrowserRouter tags.

I had this issue on react-router v4 but I solved it after changing the app to only have the BrowserRouter at the top most level like the example below.

ReactDOM.render(   <BrowserRouter >     <App />   </BrowserRouter>,   document.getElementById('root') ); 
like image 30
Artur Carvalho Avatar answered Sep 27 '22 16:09

Artur Carvalho