I am using Redux for state management.
How do I reset the store to its initial state?
For example, let’s say I have two user accounts (u1
and u2
).
Imagine the following sequence of events:
User u1
logs into the app and does something, so we cache some data in the store.
User u1
logs out.
User u2
logs into the app without refreshing the browser.
At this point, the cached data will be associated with u1
, and I would like to clean it up.
How can I reset the Redux store to its initial state when the first user logs out?
Redux-persist keeps a copy of your state in a storage engine, and the state copy will be loaded from there on refresh. First, you need to import the appropriate storage engine and then, to parse the state before setting it to undefined and clean each storage state key.
All data in redux store will be cleared to initial state when client refresh our application on the browser or close the browser's tab. So if our application have about user permission, role or something that for protected data.
To reset a component to its initial state:Store the initial state in a variable. When an event occurs, call the setState() function, passing it the initial state.
One way to do that would be to write a root reducer in your application.
The root reducer would normally delegate handling the action to the reducer generated by combineReducers()
. However, whenever it receives USER_LOGOUT
action, it returns the initial state all over again.
For example, if your root reducer looked like this:
const rootReducer = combineReducers({ /* your app’s top-level reducers */ })
You can rename it to appReducer
and write a new rootReducer
delegating to it:
const appReducer = combineReducers({ /* your app’s top-level reducers */ }) const rootReducer = (state, action) => { return appReducer(state, action) }
Now we just need to teach the new rootReducer
to return the initial state in response to the USER_LOGOUT
action. As we know, reducers are supposed to return the initial state when they are called with undefined
as the first argument, no matter the action. Let’s use this fact to conditionally strip the accumulated state
as we pass it to appReducer
:
const rootReducer = (state, action) => { if (action.type === 'USER_LOGOUT') { return appReducer(undefined, action) } return appReducer(state, action) }
Now, whenever USER_LOGOUT
fires, all reducers will be initialized anew. They can also return something different than they did initially if they want to because they can check action.type
as well.
To reiterate, the full new code looks like this:
const appReducer = combineReducers({ /* your app’s top-level reducers */ }) const rootReducer = (state, action) => { if (action.type === 'USER_LOGOUT') { return appReducer(undefined, action) } return appReducer(state, action) }
In case you are using redux-persist, you may also need to clean your storage. Redux-persist keeps a copy of your state in a storage engine, and the state copy will be loaded from there on refresh.
First, you need to import the appropriate storage engine and then, to parse the state before setting it to undefined
and clean each storage state key.
const rootReducer = (state, action) => { if (action.type === SIGNOUT_REQUEST) { // for all keys defined in your persistConfig(s) storage.removeItem('persist:root') // storage.removeItem('persist:otherKey') return appReducer(undefined, action); } return appReducer(state, action); };
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