vuex重置一切state(可定制)

在正式场景中我们常常碰到一个题目,就是登出页面或其他操纵的时刻,我们须要重置一切的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,使其不被更新。
固然我们也能够传入值来更新响应值,其他一切值不举行更新(这里我们就不细致申明)

以上,就是我实践思索出来的要领,可能有不足的处所,迎接人人发问、交换或提出更好的发起。感谢

    原文作者:unique丶J
    原文地址: https://segmentfault.com/a/1190000017924217
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞