在正式场景中我们常常碰到一个题目,就是登出页面或其他操纵的时刻,我们须要重置一切的vuex,让其变成初始状况,
那末,就触及到了多种要领:
1、页面革新:
window.location.reload()
这个要领经由过程路由推断优化或是逻辑优化,一直页面时从新加载,就会致使用户体验很差,对浏览器来讲也是一种不必要的累赘,
所以我尝试以后就摒弃了。
2、写一个重置的要领然后调取
actions.resetVuex = function() {
store.commit(state.a, null)
store.commit(state.b, null)
store.commit(state.c, null)
...
}
store.dispatch('resetVuex')
如许又会涌现多个module,多个state,须要手动增加多个,工作量庞大且不容易保护,而且假如我们state初始是个个数组,一个对象这些更不好操纵,更优最多就是我们初始的时刻深拷贝一份,然则也须要每一个module里举行操纵和封装
这两种要领是能够解决题目标,然则我照样没有采纳这两种体式格局,由于觉得已捐躯了某些东西来杀青目标了,经由过程我重复的实践,和探索我采取了以下要领:
起首页面加载,第一次加载引入store的时刻,store的一切state肯定是初始值,那末我就做一个当地缓存记录下来:
这里我采纳了store插件(援用体式格局参考 https://github.com/nbubna/store)
在main.js建立vue实例之前:
import _store from 'store'
import createStore from './store'
...
const store = createStore() //我建立好的 vuex库
_store({ initState: store.state }) //缓存一个名为initState的初始状况
我们晓得main.js是页面载入的时刻实行一次的那末缓存的initState就是本身最最先建立store里的state状况
(包含了module里的一切state);
然后我们在store建立的全局写一个mutation要领
这里我采纳了store插件(援用体式格局参考 https://github.com/nbubna/store)
这里我采纳了lodash插件(援用体式格局参考 https://www.lodashjs.com/)
import _ from 'lodash'
import _store from 'store2'
...
const store = new Vuex.Store({
state: {
token: ''
},
mutations: {
resetAllState (state, payload = []) {
if (payload instanceof Array === false) { // 考证传入的是一个数组
return
}
const initState = _store('initState') // 掏出初始值的缓存
const _initState = payload.length ? _.omit(initState, payload) : initState // 推断传入值有没有数据,有数据剔除相对应的值
_.extend(state, _initState)
}
},
modules: {
...
}
})
这个名叫resetAllState的mutation要领里就是讲全局的state替换成我们缓存的state。
这里为何 payload 是一个数组呢?
由于这就是题目所形貌的可定制,假如页面内重置绝大部分状况,但须要保存个中一些状况的时刻我们能够经由过程我们通报过来的state值来剔除响应的state,使其不被更新。
固然我们也能够传入值来更新响应值,其他一切值不举行更新(这里我们就不细致申明)
以上,就是我实践思索出来的要领,可能有不足的处所,迎接人人发问、交换或提出更好的发起。感谢