I'm trying to figure out how to make my React SPA app maintain state when the user navigates with the back/forward browser buttons. E.g. the user is filling a form, then he moves back and forward and the form is automatically restored.
I reviewed many JavaScript routers around but none seem to address this issue properly... (or even at all).
Currently I'm using React Router 4 and this is the pattern I'm adopting:
history.replace(this.state)
; then I move out of the page with history.push(newLocation)
componentWillMount
) I check for this.props.location.state !== undefined
and if so, I restore it with this.setState(this.props.location.state)
My question is: is the above pattern correct? suggested? Is there any better and widely adopted way?
Intercept or Handle the Browser's Back Button in React Router. We can listen to back button actions by running the setRouteLeaveHook event for back button actions. } export default withRouter(App);
To maintain state after a page refresh in React, we can save the state in session storage. const Comp = () => { const [count, setCount] = useState(1); useEffect(() => { setCount(JSON. parse(window. sessionStorage.
Unfortunately, there isn't a built-in way for us to reset the state of the component to its initial state, so we have to extract the initial state into a variable. When you manage state using the useState hook, all you have to do is call your setState function passing it the initial state.
after a while I found a reasonable workaround:
this.setState()
I keep state synchronized with history using window.history.replaceState({ key: history.location.key, state: this.state})
willMount
and willReceiveProps
) I check for state in props.params.location.state
: if there is one, I do restore it; if there is none I create a fresh new state.this.setState
and window.history.pushState
This solution seems to work nicely, the only minor cons are:
this.setState
is a pitfall because it's asynchronous, you cannot use this.state
after it, unless you do trickery. constructor()
of the Component
Overall I have written a PageComponent
that extends Component
that does all the init/restoration work; it also overrides this.setState
to make it syncs automatically with history and avoids the asynchronous annoyances.
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