重置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 相关文章推荐
js类 from qq
Nov 13 Javascript
jQuery使用手册之 事件处理
Mar 24 Javascript
offsetParent 算法分析
Apr 05 Javascript
JavaScript设计模式之适配器模式介绍
Dec 28 Javascript
详细解读AngularJS中的表单验证编程
Jun 19 Javascript
Node.js调试技术总结分享
Mar 12 Javascript
AngularJS实现页面定时刷新
Mar 14 Javascript
angularjs实现首页轮播图效果
Apr 14 Javascript
js表单序列化判断空值的实例
Sep 22 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
Mar 27 Javascript
JavaScript中this的全面解析及常见实例
May 14 Javascript
jQuery HTML css()方法与css类实例详解
May 20 jQuery
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将数据库中的电话号码读取出来并生成图片
2008/08/31 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
PHP Cookie学习笔记
2016/08/23 PHP
PHP基于ip2long实现IP转换整形
2020/12/11 PHP
用JavaScript脚本实现Web页面信息交互
2006/12/21 Javascript
让人期待的2011年度最佳 jQuery 插件分享
2012/03/16 Javascript
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
jQuery中prevAll()方法用法实例
2015/01/08 Javascript
javascript折半查找详解
2015/01/26 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
2016/07/06 Javascript
JavaScript蒙板(model)功能的简单实现代码
2016/08/04 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
Node.js用readline模块实现输入输出
2016/12/16 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
微信小程序实战篇之购物车的实现代码示例
2017/11/30 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
基于jquery ajax的多文件上传进度条过程解析
2019/09/11 jQuery
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
VueQuillEditor富文本上传图片(非base64)
2020/06/03 Javascript
python3音乐播放器简单实现代码
2020/04/20 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
使用WingPro 7 设置Python路径的方法
2019/07/24 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
使用Tensorflow将自己的数据分割成batch训练实例
2020/01/20 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
python中yield的用法详解
2021/01/13 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
大学毕业生求职自荐书
2014/06/05 职场文书
我的中国梦演讲稿500字
2014/08/19 职场文书
小学生放飞梦想演讲稿
2014/08/26 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
刘公岛导游词
2015/02/05 职场文书
高一作文之暖冬
2019/11/09 职场文书