重置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 confirm选择判断
Oct 18 Javascript
javascript与jquery中跳出循环的区别总结
Nov 04 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
Mar 08 Javascript
jQuery树形下拉菜单特效代码分享
Aug 15 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
May 23 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
Aug 15 Javascript
使用Node.js给图片加水印的方法
Nov 15 Javascript
Vue 2.0 服务端渲染入门介绍
Mar 29 Javascript
深入理解vue中的slot与slot-scope
Apr 22 Javascript
webpack proxy 使用(代理的使用)
Jan 10 Javascript
javascript将扁平的数据转为树形结构的高效率算法
Feb 27 Javascript
详解ES6 扩展运算符的使用与注意事项
Nov 12 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中的 == 运算符进行字符串比较
2006/11/26 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
2013/02/14 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
php实现的用户查询类实例
2015/06/18 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
javascript下给元素添加事件的方法与代码
2007/08/13 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
一个css与js结合的下拉菜单支持主流浏览器
2014/10/08 Javascript
Javascript 正则表达式校验数字的简单实例
2016/11/02 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
2016/11/25 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
在angular 6中使用 less 的实例代码
2018/05/13 Javascript
react-native android状态栏的实现
2018/06/15 Javascript
Mint UI实现A-Z字母排序的城市选择列表
2018/12/28 Javascript
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
2020/03/20 jQuery
vue cli3适配所有端方案的实现
2020/04/13 Javascript
Python常用模块用法分析
2014/09/08 Python
Python random模块常用方法
2014/11/03 Python
解决Linux系统中python matplotlib画图的中文显示问题
2017/06/15 Python
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
Python科学画图代码分享
2017/11/29 Python
python pygame实现方向键控制小球
2019/05/17 Python
python中有关时间日期格式转换问题
2019/12/25 Python
python实现四人制扑克牌游戏
2020/04/22 Python
将不规则的Python多维数组拉平到一维的方法实现
2021/01/11 Python
美国领先的低折扣旅行网站:Hotwire
2019/01/19 全球购物
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
初一体育教学反思
2014/01/29 职场文书
2016年11月份红领巾广播稿
2015/12/21 职场文书
入党转正申请自我鉴定
2019/06/25 职场文书
Java中常用解析工具jackson及fastjson的使用
2021/06/28 Java/Android
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS
Python实现猜拳与猜数字游戏的方法详解
2022/04/06 Python
Nginx跨域问题解析与解决
2022/08/05 Servers