I am new to React Router and learn that there are so many ways to redirect a page:
Using
browserHistory.push("/path")
import { browserHistory } from 'react-router'; //do something... browserHistory.push("/path");
Using
this.context.router.push("/path")
class Foo extends React.Component { constructor(props, context) { super(props, context); //do something... } redirect() { this.context.router.push("/path") } } Foo.contextTypes = { router: React.PropTypes.object }
In React Router v4, there's
this.context.history.push("/path")
andthis.props.history.push("/path")
. Details: How to push to History in React Router v4?
I'm so confused by all these options, is there a best way to redirect a page?
Actually it depends on your use case
1) You want to protect your route from unauthorized users
If that is the case you can use the component called
<Redirect />
and can implement the following logic:But keep in mind that, if you want
<Redirect />
to work the way you expect, you should place it inside of your component's render method so that it should eventually be considered as a DOM element, otherwise it won't work.2) You want to redirect after a certain action (let's say after creating an item)
In that case you can use history
or
In order to have access to history, you can wrap your component with an HOC called
withRouter
when you wrap your component with it, it passesmatch
location
andhistory
props. For more detail please have a look at the official documentation about withRouterIf your component is a child of
<Route />
component, I mean if it is something like<Route path='/path' component={myComponent} />
you don't have to wrap your component withwithRouter
<Route />
passesmatch
location
andhistory
to its child.3) Redirect after clicking some element
There are two options here. You can use
history.push()
by passing it to a onClick eventor you can use
<Link />
componentI think rule of thumb with this case is (I suppose especially beceause of performance) try to use
<Link />
first