当前位置: 移动技术网 > IT编程>脚本编程>vue.js > vuex如何重置所有state(可定制)

vuex如何重置所有state(可定制)

2019年03月16日  | 移动技术网IT编程  | 我要评论

问心堂,杨白冰政变细节,毛坦厂中学校花

在正式场景中我们经常遇到一个问题,就是登出页面或其他操作的时候,我们需要重置所有的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插件(引用方式参考 )

在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插件(引用方式参考 )

这里我采用了lodash插件(引用方式参考 )

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,使其不被更新。

当然我们也可以传入值来更新相应值,其他所有值不进行更新(这里我们就不详细说明)

以上就是我实践思考出来的方法,可能有不足的地方,欢迎大家提问、交流或提出更好的建议。也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网