I'm taking my first steps with react-router
.
I'm currently using the hashHistory
for development purposes and I'm performing 'manual' navigation. That is to say, I'm not using Link
and I'm invoking history.push('/some/route');
in order to navigate (in response to plain old clicks on anchor tags).
What I'm noticing is that, even when I'm already on the target route, react-router
will re-render the relevant target component every time history.push('/target/route');
is invoked: On every push('/target/route')
:
#/target/route
?_k=somethingRandom
I would like for that re-rendering to not happen - I actually expected history.push
to be a no-op when I'm already at the route that I'm attempting to push
.
I'm apparently missing something, as this is not what's happening. Funnily enough I'm seeing posts from people who are trying to achieve the behaviour that I'd like to get rid of - they'd like to 'refresh' a route without leaving it, so to speak. Which looks pretty much like the opposite problem :).
Could you enlighten me as to what it is I'm misunderstanding and how I would achieve the desired behaviour? Is this perhaps something that would go away if (when) I switch to browserHistory
?
Use the preventDefault() method on the event object to prevent a page refresh on form submit in React, e.g. event. preventDefault() . The preventDefault method prevents the browser from issuing the default action which in the case of a form submission is to refresh the page.
Using componentDidUpdate method of React page lifecycle, you can handled or disabled go back functionality in browser. basically componentDidUpdate method will call automatocally when component got updated. so once your component is updated you can prevent to go back as below.
To restrict access to routes in React Router, we set the render prop to a function that renders the component we want according to the condition we're checking. import { Route, Redirect } from "react-router"; <Route exact path="/" render={() => (loggedIn ?
push(`/route`); This will clear the history and change for a new one.
My guess is that your component re-renders because something in your prop
changes when you make a router push. I suspect it might be the action
or key
properties of prop.location
. You could always check all the values of prop
during each render to see what changes.
You can solve this issue by comparing your old route path with the new one in the shouldComponentUpdate
life-cycle method. If it hasn't changed you are on the same route, and you can prevent the re-rendering by returning false
. In all other cases, return true
. By default this always returns true.
shouldComponentUpdate: function(nextProps, nextState) {
if(this.props.route.path == nextProps.route.path) return false;
return true;
}
You'll have to make further checks as well as this will prevent your component from updating on state
updates within the component as well, but I guess this would be your starting point.
Read more about shouldComponentUpdate
on the official react docs page.
Use this as an opportunity to return false when you're certain that the transition to the new props and state will not require a component update.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With