'How can I run code on a route change from certain pages using react-router 5
I've found lots of examples on v4 with the onLeave function. it seems this was discontinued after v4 however.
I've seen some <Prompt> examples but dont think thats what i'm looking for. if you have a case that will work i am open to it.
My Scenario: React v16 app where i have multiple tables. I have a section in the store (global state) where i retain certain ui preferences. the tables paginate and reuse some of the same state info for pagination, sort, etc.
user story - user selects page 4, then navigates to another table, is still on page 4 (pagination is read from the store). I simple want to purge the values from state (im using redux so i will call an action to do this) but how can i trigger that, for example, on only a few routes in my app. this way i can reset it on leave and its ready by the time the user gets to the next table?
//edit for comment 1, basic example
const routes = [
{
path: "/one-thing",
component: OneThing,
},
{
path: "/two-thing",
component: TwoThing,
},
...
this is a huge app, but this might clarify. How can i run code, when i leave the path /one-thing?
we used to be able to do this in v4
{
path: "/two-thing",
component: TwoThing,
onLeave: doAThing,
},
Solution 1:[1]
Sounds like you could either listen for changes to the current location via the history object in a parent component.
import { useHistory } from 'react-router-dom';
import { useEffect } from "react";
...
const history = useHistory();
useEffect(() => {
const unlisten = history.listen((location, action) => {
console.log('Route changed', { location, action });
// Apply route change logic, i.e. dispatch to store
});
return unlisten;
}, []);
Or use unmounting useEffect cleanup function in the component with table.
import { useEffect } from "react";
...
useEffect(() => {
return() => {
// component unmounting (maybe from route change)
// Apply route change logic, i.e. dispatch to store
};
}, []);
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
