Thursday, August 30, 2018

reactjs - Programmatically navigate using react router


React-Router 5.1.0+ Answer (using hooks and React >16.8)



You can use the new useHistory hook on Functional Components and Programmatically navigate:


import { useHistory } from "react-router-dom";
function HomeButton() {
let history = useHistory();
// use history.push('/some/path') here
};


React-Router 4.0.0+ Answer



In 4.0 and above, use the history as a prop of your component.


class Example extends React.Component {
// use `this.props.history.push('/some/path')` here
};

NOTE: this.props.history does not exist in the case your component was not rendered by . You should use to have this.props.history in YourComponent



React-Router 3.0.0+ Answer



In 3.0 and above, use the router as a prop of your component.


class Example extends React.Component {
// use `this.props.router.push('/some/path')` here
};


React-Router 2.4.0+ Answer



In 2.4 and above, use a higher order component to get the router as a prop of your component.


import { withRouter } from 'react-router';
class Example extends React.Component {
// use `this.props.router.push('/some/path')` here
};
// Export the decorated class
var DecoratedExample = withRouter(Example);
// PropTypes
Example.propTypes = {
router: React.PropTypes.shape({
push: React.PropTypes.func.isRequired
}).isRequired
};


React-Router 2.0.0+ Answer



This version is backwards compatible with 1.x so there's no need to an Upgrade Guide. Just going through the examples should be good enough.


That said, if you wish to switch to the new pattern, there's a browserHistory module inside the router that you can access with


import { browserHistory } from 'react-router'


Now you have access to your browser history, so you can do things like push, replace, etc... Like:


browserHistory.push('/some/path')


Further reading:
Histories and
Navigation





React-Router 1.x.x Answer



I will not go into upgrading details. You can read about that in the Upgrade Guide


The main change about the question here is the change from Navigation mixin to History. Now it's using the browser historyAPI to change route so we will use pushState() from now on.


Here's an exemple using Mixin:


var Example = React.createClass({
mixins: [ History ],
navigateToHelpPage () {
this.history.pushState(null, `/help`);
}
})

Note that this History comes from rackt/history project. Not from React-Router itself.


If you don't want to use Mixin for some reason (maybe because of ES6 class), then you can access the history that you get from the router from this.props.history. It will be only accessible for the components rendered by your Router. So, if you want to use it in any child components it needs to be passed down as an attribute via props.


You can read more about the new release at their 1.0.x documentation


Here is a help page specifically about navigating outside your component


It recommends grabbing a reference history = createHistory() and calling replaceState on that.



React-Router 0.13.x Answer



I got into the same problem and could only find the solution with the Navigation mixin that comes with react-router.


Here's how I did it


import React from 'react';
import {Navigation} from 'react-router';
let Authentication = React.createClass({
mixins: [Navigation],
handleClick(e) {
e.preventDefault();
this.transitionTo('/');
},
render(){
return (
Click me!
);
}
});

I was able to call transitionTo() without the need to access .context


Or you could try the fancy ES6 class


import React from 'react';
export default class Authentication extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick(e) {
e.preventDefault();
this.context.router.transitionTo('/');
}
render(){
return (
Click me!
);
}
}
Authentication.contextTypes = {
router: React.PropTypes.func.isRequired
};


React-Router-Redux


Note: if you're using Redux, there is another project called
React-Router-Redux that gives you
redux bindings for ReactRouter, using somewhat the same approach that
React-Redux does



React-Router-Redux has a few methods available that allow for simple navigating from inside action creators. These can be particularly useful for people that have existing architecture in React Native, and they wish to utilize the same patterns in React Web with minimal boilerplate overhead.


Explore the following methods:



  • push(location)

  • replace(location)

  • go(number)

  • goBack()

  • goForward()


Here is an example usage, with Redux-Thunk:


./actioncreators.js


import { goBack } from 'react-router-redux'
export const onBackPress = () => (dispatch) => dispatch(goBack())

./viewcomponent.js


  disabled={submitting}
className="cancel_button"
onClick={(e) => {
e.preventDefault()
this.props.onBackPress()
}}
>
CANCEL

No comments:

Post a Comment

plot explanation - Why did Peaches' mom hang on the tree? - Movies & TV

In the middle of the movie Ice Age: Continental Drift Peaches' mom asked Peaches to go to sleep. Then, she hung on the tree. This parti...