重置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 相关文章推荐
javascript模版引擎-tmpl的bug修复与性能优化分析
Oct 23 Javascript
js判断屏幕分辨率的代码
Jul 16 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
Dec 18 Javascript
JavaScript原型链示例分享
Jan 26 Javascript
js动态控制table的tr、td增加及删除的具体实现
Apr 30 Javascript
javascript判断图片是否加载完成的方法推荐
May 13 Javascript
setTimeout函数的神奇使用
Feb 26 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
Dec 25 Javascript
深入理解ES6之数据解构的用法
Jan 13 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
Nov 12 jQuery
3分钟读懂移动端rem使用方法(推荐)
May 06 Javascript
javascript面向对象三大特征之封装实例详解
Jul 24 Javascript
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
PHP4在WinXP下IIS和Apache2服务器上的安装实例
2006/10/09 PHP
php Try Catch异常测试
2009/03/01 PHP
php使用json_encode对变量json编码
2014/04/07 PHP
php实现通过cookie换肤的方法
2015/07/13 PHP
php将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
零基础php编程好学吗
2019/10/11 PHP
一个选择最快的服务器转向代码
2009/04/27 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
2016/04/05 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
2016/11/29 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
Thinkjs3新手入门之添加一个新的页面
2017/12/06 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
通过实例了解Nodejs模块系统及require机制
2020/07/16 NodeJs
[44:15]国士无双DOTA2 6.82版本详解(上)
2014/09/28 DOTA
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python实现两个文件合并功能
2018/04/01 Python
django celery redis使用具体实践
2019/04/08 Python
Flask配置Cors跨域的实现
2019/07/12 Python
Python 识别12306图片验证码物品的实现示例
2020/01/20 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
python raise的基本使用
2020/09/10 Python
python实现自动打卡的示例代码
2020/10/10 Python
印度最大的酒店品牌网络:OYO Rooms
2016/07/24 全球购物
房地产销售主管岗位职责
2015/02/13 职场文书
英语导游词
2015/02/13 职场文书