重置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 相关文章推荐
关于IFRAME 自适应高度的研究
Jul 20 Javascript
jquery的Theme和Theme Switcher使用小结
Sep 08 Javascript
百度地图api应用标注地理位置信息(js版)
Feb 01 Javascript
JS 删除字符串最后一个字符的实现代码
Feb 20 Javascript
JS实现图片高亮展示效果实例
Nov 24 Javascript
JavaScript鼠标特效大全
Sep 13 Javascript
jquery做个日期选择适用于手机端示例
Jan 10 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
Jul 16 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
Nov 22 Javascript
vue2.0 资源文件assets和static的区别详解
Apr 08 Javascript
vue配置font-awesome5的方法步骤
Jan 27 Javascript
vue制作toast组件npm包示例代码
Oct 29 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
php实现的支持断点续传的文件下载类
2014/09/23 PHP
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
2013/12/17 Javascript
Nodejs中自定义事件实例
2014/06/20 NodeJs
javascript 动态创建表格
2015/01/08 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
浅析创建javascript对象的方法
2016/05/13 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
JS拉起或下载app的实现代码
2017/02/22 Javascript
JavaScript事件处理程序详解
2017/09/19 Javascript
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
2019/03/06 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
简单了解vue.js数组的常用操作
2019/06/17 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
python对字典进行排序实例
2014/09/25 Python
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
Python3中多线程编程的队列运作示例
2015/04/16 Python
python计算方程式根的方法
2015/05/07 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
Python hashlib模块加密过程解析
2019/11/05 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
报关简历自我评价怎么写
2013/09/19 职场文书
工业设计专业个人求职信范文
2013/12/28 职场文书
财政专业求职信范文
2014/02/19 职场文书
学校感恩节活动策划方案
2014/10/06 职场文书
学生评语集锦
2015/01/04 职场文书
文明上网主题班会
2015/08/14 职场文书
Go语言并发编程 sync.Once
2021/10/16 Golang