重置Redux的状态数据的方法实现


Posted in Javascript onNovember 18, 2019

在 Redux 使用过程中,通常需要重置 store 的状态,比如应用初始化的时候、用户退出登录的时候,这样能够避免数据残留,避免 UI 显示了上一个用户的数据,容易造成用户数据泄露。

最简单的实现方法就是为每个独立的 store 添加RESET_APP 的 action,每次需要 reset 的时候,dispatch 这个 action 即可,如下代码

const usersDefaultState = [];

const users = (state = usersDefaultState, { type, payload }) => {
 switch (type) {
  case "ADD_USER":
   return [...state, payload];
  default:
   return state;
 }
};

添加 reset action 后:

const usersDefaultState = []

const users = (state = usersDefaultState, { type, payload }) => {
 switch (type) {
  case "RESET_APP":
   return usersDefaultState;
  case "ADD_USER":
   return [...state, payload];
  default:
   return state;
 }
};

这样虽然简单,但是当独立的 store 较多时,需要添加很多 action,而且需要很多个 dispatch 语句去触发,比如:

dispatch({ type: RESET_USER });
dispatch({ type: RESET_ARTICLE });
dispatch({ type: RESET_COMMENT });

当然你可以封装一下代码,让一个RESET_DATA 的 action 去触发多个 reset 的 action,避免业务代码看上去太乱。

不过本文介绍一种更优雅的实现,需要用到一个小技巧,看下面代码:

const usersDefaultState = []
const users = (state = usersDefaultState, { type, payload }) => {...}

当函数参数 state 为 undefined 时,state 就会去 usersDefaultState 这个默认值,利用这个技巧,我们可以在 rootReducers 中检测 RESET_DATA action,直接赋值 undefined 就完成了所有 store 的数据重置。实现代码如下:

我们通常这样导出所有的 reducers

// reducers.js
const rootReducer = combineReducers({
 /* your app's top-level reducers */
})

 
export default rootReducer;

先封装一层,combineReducers 返回 reducer 函数,不影响功能

// reducers.js
const appReducer = combineReducers({
 /* your app's top-level reducers */
})

const rootReducer = (state, action) => {
 return appReducer(state, action)
}

export default rootReducer;

检测到特定重置数据的 action 后利用 undefined 技巧 (完整代码)

// reducers.js
const appReducer = combineReducers({
 /* your app's top-level reducers */
})

const rootReducer = (state, action) => {
 if (action.type === 'RESET_DATA') {
  state = undefined
 }

 return appReducer(state, action)
}

参考:

Resetting Redux State with a Root Reducer
How to reset the state of a Redux store?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
跟我一起学写jQuery插件开发方法(附完整实例及下载)
Apr 01 Javascript
奉献给JavaScript初学者的编写开发的七个细节
Jan 11 Javascript
收集的10个免费的jQuery相册
Feb 26 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
Dec 29 Javascript
深入分析javascript中console命令
Aug 14 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
Mar 23 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
Oct 01 Javascript
mongoose更新对象的两种方法示例比较
Dec 19 Javascript
js计算最大公约数和最小公倍数代码实例
Sep 11 Javascript
JavaScript提升机制Hoisting详解
Oct 23 Javascript
Vue组件通信中非父子组件传值知识点总结
Dec 05 Javascript
vue-cli中实现响应式布局的方法
Mar 02 Vue.js
JavaScript数值类型知识汇总
Nov 17 #Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
Nov 17 #Javascript
AngularJS动态生成select下拉框的方法实例
Nov 17 #Javascript
24行JavaScript代码实现Redux的方法实例
Nov 17 #Javascript
JavaScript如何处理移动端拍摄图片旋转问题
Nov 16 #Javascript
JS Ajax请求会话过期处理问题解决方法分析
Nov 16 #Javascript
vue中注册自定义的全局js方法
Nov 15 #Javascript
You might like
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
从JavaScript的函数重名看其初始化方式
2007/03/08 Javascript
读jQuery之五(取DOM元素)
2011/06/20 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
js制作简易年历完整实例
2015/01/28 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
2016/06/12 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
jQuery select自动选中功能实现方法分析
2016/11/28 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
2017/12/20 Javascript
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
在Django的View中使用asyncio的方法
2019/07/12 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
Python WebSocket长连接心跳与短连接的示例
2020/11/24 Python
python中re模块知识点总结
2021/01/17 Python
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
百度软件工程师职位
2013/02/14 面试题
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
2012/05/30 面试题
Java面试题汇总
2015/12/06 面试题
汽车工程专业应届生求职信
2013/10/19 职场文书
应届生保险求职信
2013/11/11 职场文书
临床护士自荐信
2014/01/31 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
红头文件任命书范本
2014/06/05 职场文书
班级心理活动总结
2014/07/04 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
2014年客房部工作总结
2014/11/22 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
golang 实现两个结构体复制字段
2021/04/28 Golang
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python