重置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 相关文章推荐
csdn 批量接受好友邀请
Feb 19 Javascript
Jquery Validate 正则表达式实用验证代码大全
Aug 23 Javascript
setTimeout()与setInterval()方法区别介绍
Dec 24 Javascript
php实例分享之实现显示网站运行时间
May 20 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
Jan 30 Javascript
详解PHP中pathinfo()函数导致的安全问题
Jan 05 Javascript
js实现登录框鼠标拖拽效果
Mar 09 Javascript
AngularJS学习笔记之表单验证功能实例详解
Jul 06 Javascript
Angular4如何自定义首屏的加载动画详解
Jul 26 Javascript
亲自动手实现vue日历控件
Jun 26 Javascript
vue+vant实现商品列表批量倒计时功能
Jan 13 Javascript
CKEditor扩展插件:自动排版功能autoformat插件实现方法详解
Feb 06 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
Thinkphp中import的几个用法详细介绍
2014/07/02 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
JavaScript中void(0)的具体含义解释
2007/02/27 Javascript
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
Jquery使用val方法读写value值
2015/05/18 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
2016/11/29 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
jquery二级目录选中当前页的css样式
2016/12/08 Javascript
VUE JS 使用组件实现双向绑定的示例代码
2017/01/10 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
es6学习笔记之Async函数基本教程
2017/05/11 Javascript
基于Vue的文字跑马灯组件(npm 组件包)
2017/05/24 Javascript
详解Angular 4 表单快速入门
2017/06/05 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
vue+AI智能机器人回复功能实现
2020/07/16 Javascript
JavaScript中EventBus实现对象之间通信
2020/10/18 Javascript
Python下载网络小说实例代码
2018/02/03 Python
Python切片操作实例分析
2018/03/16 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
Python结合百度语音识别实现实时翻译软件的实现
2021/01/18 Python
自我评价怎么写好呢?
2013/12/05 职场文书
小学五年级学生评语
2014/04/22 职场文书
2014年大班保育员工作总结
2014/12/02 职场文书
2014财务年终工作总结
2014/12/08 职场文书
2014年检察院个人工作总结
2014/12/09 职场文书
小学优秀教师材料
2014/12/15 职场文书
雷锋的故事观后感
2015/06/10 职场文书
小学新课改心得体会
2016/01/22 职场文书
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis