Quick story of my problem:
- Absolutely no data is stored in my vuex state when the page loads
- If the user is logged in(or has info stored in
window.localStorage
and therefore gets auto logged in) my vuex store retrieves all the info from a socket that requires authentication. - Then the user logs out, But my vuex state save still retains all its data
This would be a security issue as not logged in people(or hackers) on a public pc could view what the state was before the user logged out.
I have seen How to clear state in vuex store? But I feel that this is a hack and should be avoided.
My current solution is just to refresh the page using location.reload();
Is there a better way to prevent this data leak?
Advertisement
Answer
All objects stored in Vue act as an observable. So if the reference of a value is changed/mutated it triggers the actual value to be changed too.
So, In order to reset the state the initial store modules has to be copied as a value.
On logging out of a user, the same value has to be assigned for each module as a copy.
This can be achieved as follows:
// store.js // Initial store with modules as an object export const initialStoreModules = { user, recruitment, }; export default new Vuex.Store({ /** * Assign the modules to the store * using lodash deepClone to avoid changing the initial store module values */ modules: _.cloneDeep(initialStoreModules), mutations: { // reset default state modules by looping around the initialStoreModules resetState(state) { _.forOwn(initialStoreModules, (value, key) => { state[key] = _.cloneDeep(value.state); }); }, } });
Then call commit("resetState");
when the user logs out.