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


Posted in Javascript onJanuary 17, 2019

在正式场景中我们经常遇到一个问题,就是登出页面或其他操作的时候,我们需要重置所有的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,使其不被更新。

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

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

Javascript 相关文章推荐
javascript实现的listview效果
Apr 28 Javascript
extjs 学习笔记(三) 最基本的grid
Oct 15 Javascript
jquerymobile局部渲染的各种刷新方法小结
Mar 05 Javascript
再次谈论Javascript中的this
Jun 23 Javascript
概述VUE2.0不可忽视的很多变化
Sep 25 Javascript
JS碰撞运动实现方法详解
Dec 15 Javascript
JavaScript使用readAsDataUrl方法预览图片
May 10 Javascript
浅谈Angular路由复用策略
Oct 04 Javascript
easyui下拉框动态级联加载的示例代码
Nov 29 Javascript
Vue 中的受控与非受控组件的实现
Dec 17 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
Mar 25 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
Aug 20 Javascript
node app 打包工具pkg的具体使用
Jan 17 #Javascript
JS实现深度优先搜索求解两点间最短路径
Jan 17 #Javascript
JS使用Dijkstra算法求解最短路径
Jan 17 #Javascript
JavaScript简单实现的仿微博留言功能示例
Jan 17 #Javascript
vue权限管理系统的实现代码
Jan 17 #Javascript
使用nvm和nrm优化node.js工作流的方法
Jan 17 #Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
Jan 17 #Javascript
You might like
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
jquery+css+ul模拟列表菜单具体实现思路
2013/04/15 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
小巧强大的jquery layer弹窗弹层插件
2015/12/06 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
JSON与String互转的实现方法(Javascript)
2016/09/27 Javascript
Nodejs进阶:核心模块net入门学习与实例讲解
2016/11/21 NodeJs
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
vue2.0 中#$emit,$on的使用详解
2017/06/07 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
微信小程序实现自定义picker选择器弹窗内容
2020/05/26 Javascript
python实现划词翻译
2020/04/23 Python
python中的字典使用分享
2016/07/31 Python
Python中取整的几种方法小结
2017/01/06 Python
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
python使用tornado实现简单爬虫
2018/07/28 Python
python实现简单加密解密机制
2019/03/19 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
Django中的FBV和CBV用法详解
2019/09/15 Python
Python坐标线性插值应用实现
2019/11/13 Python
python3 字符串知识点学习笔记
2020/02/08 Python
python在不同条件下的输入与输出
2020/02/13 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
很酷的HTML5电子书翻页动画特效
2016/02/25 HTML / CSS
Superdry极度乾燥官网:日本街头风格,纯英国制造品牌
2016/10/31 全球购物
Coach澳大利亚官方网站:美国著名时尚奢侈品牌
2017/05/24 全球购物
软件测试工程师面试问题精选
2016/10/28 面试题
社区学习雷锋活动总结
2014/04/25 职场文书
爱心活动计划书
2014/04/26 职场文书
美国留学经济担保书
2014/05/20 职场文书
事业单位鉴定材料
2014/05/25 职场文书
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript
欧元符号 €
2022/02/17 杂记