我们在正式场景中经常会遇到一个问题,就是在退出某个页面或者其他操作的时候,我们需要重置所有vuex,使其成为初始状态,那么,它涉及到一个多种方法:1.页面刷新:window.location.reload()这种方法通过路由判断优化或者逻辑优化,总是重新加载页面,会导致用户体验不好,对于浏览器也是如此。不必要的负担,所以我尝试后放弃了。2.写一个reset方法,调用actions.resetVuex=function(){store.commit(state.a,null)store.commit(state.b,null)store.commit(state.c,null)。..}store.dispatch('resetVuex')这样会出现多个模块,多个状态,需要手动添加,工作量巨大,维护难度大。而且,如果我们的状态一开始就是一个数组,一个对象就更容易操作了,最优化的就是我们一开始就深拷贝一份,但是我们也需要在各个模块中进行操作和封装。这两种方法都可以解决问题,但是我还是没有使用这两种方法,因为我觉得为了达到目的我已经牺牲了一些东西。通过我反复的实践和摸索,我采用了以下方法:首先加载页面,第一次加载store时,store的所有状态都必须是初始值,所以我会做一个本地缓存记录:这里我在main.js中创建vue实例前使用了store插件(参考https://github.com/nbubna/store):import_storefrom'store'importcreateStorefrom'./store'...conststore=createStore()//我创建的vuex库_store({initState:store.state})//缓存一个名为initState的初始状态我们知道main.js是在页面加载的时候执行的一次,缓存的initState是自己创建的store中的状态(包括模块中的所有状态);然后我们在商店创建中全局编写一个变异方法。这里我使用store插件(参考https://github.com/nbubna/store)这里我使用lodash插件(参考https://www.lodashjs.com/)import_from'lodash'从'store2'导入_store...conststore=newVuex。商店({状态:{token:''},mutations:{resetAllState(state,payload=[]){if(payloadinstanceofArray===false){//验证返回的是一个数组}constinitState=_store('initState')//取出初始值的缓存const_initState=payload.length?_.omit(initState,payload):initState//判断传入的值是否有数据,有数据则删除对应的值_.extend(state,_initState)}},modules:{...}})这种称为resetAllState的变异方法用我们的缓存状态替换了全局状态。为什么有效载荷是一个数组?因为这是标题中描述的自定义,如果页面中大部分状态都被reset了,但是有些状态需要保留,我们可以使用我们传递的state值来移除对应的state,这样就不会被更新。当然,我们也可以传入一个值来更新对应的值,其他所有值都不更新(这里不细说)。以上是我在实践中想出来的方法。可能存在不足。欢迎您提出问题、交流或提出改进建议。好建议。谢谢
