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 学习初步 入门教程
Mar 25 Javascript
使用Jquery实现点击文字后变成文本框且可修改
Sep 21 Javascript
jQuery分别获取选中的复选框值的示例
Jun 17 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
Sep 21 Javascript
用JS实现简单的登录验证功能
Jul 28 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
Sep 10 Javascript
JavaScript实现的原生态Tab标签页功能【兼容IE6】
Sep 18 Javascript
基于JavaScript表单脚本(详解)
Oct 18 Javascript
angularjs通过过滤器返回超链接的方法
Oct 26 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
Apr 26 Javascript
微信小程序实现折线图的示例代码
Jun 07 Javascript
vue.js实现回到顶部动画效果
Jul 31 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
配置最新的PHP加MYSQL服务器
2006/10/09 PHP
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
MySql中正则表达式的使用方法描述
2008/07/30 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
33种Javascript 表格排序控件收集
2009/12/03 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
jQuery同步提交示例代码
2015/12/12 Javascript
js自定义select下拉框美化特效
2016/05/12 Javascript
利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
2017/04/24 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
JS拖拽排序插件Sortable.js用法实例分析
2019/02/20 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
Openlayers测量距离与面积的实现方法
2020/09/25 Javascript
python编写爬虫小程序
2015/05/14 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
蹦床仓库:Trampoline Warehouse
2018/12/06 全球购物
PHP面试题及答案一
2012/06/18 面试题
linux面试相关问题
2013/04/28 面试题
教师读书活动总结
2014/05/07 职场文书
525心理活动总结
2014/07/04 职场文书
2014年收银工作总结
2014/11/13 职场文书
亮剑观后感
2015/06/05 职场文书
蜗居观后感
2015/06/11 职场文书
初中毕业生感言
2015/07/31 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python
Opencv实现二维直方图的计算及绘制
2021/07/21 Python
图文详解Nginx版本平滑升级方案
2021/09/15 Servers
python中数组和列表的简单实例
2022/03/25 Python