'react router's location state becomes undefined on change of route

I want to store url query as a state on location.

~   history.push({
+     ...history.location,
+     search: query.toString(),
+     state: {
+       myState: query.toString(),
+     },
+   })

I suspect get state when a route change, but state become undefined when I back from other route.



Solution 1:[1]

This is how state (which comes from the History API) works. State is attached to a location in a session and does not exist (or rather, is null) when you navigate directly to a page.

In general, I would not recommend using location.state for passing anything but temporary data (like a redirect location). If you need data attached to a location I would recommend using either path params or search params and having a store that you can lookup that data from.

// path params
{ pathname: `/path/name/${SOME_ID}` }
// search params
{ search: `?someID=${SOME_ID}` }

If you really want to use location.state, your route will need to have some sort of backup plan for using some default value when location.state is null.

Solution 2:[2]

Its the second argument in history.push(path, [state])

history.push("path/you/want/to/push/to", { state: myState: query.toString() })

You can look for the state from location.state

Note: Also the state will not be available in other routes. Each route has its own state which is inaccessible by other routes.

Its stated in the docs here

Normally you just use a string, but if you need to add some "location state" that will be available whenever the app returns to that specific location, you can use a location object instead. This is useful if you want to branch UI based on navigation history instead of just paths (like modals).

Solution 3:[3]

In my case, the problem was the pathname. you should write the exact url to send state.

target url=/page1/page2/page3/

 const path = '/page1/page2/page3';
 history.push({ pathname: `${path}`, state: {item: myItem}}); //state will be undefined
 const path = '/page1/page2/page3/';
 history.push({ pathname: `${path}`, state: {item: myItem}); //state will be {item: myItem}

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 Tenusha Guruge
Solution 2
Solution 3 Marzieh Mousavi