重置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 相关文章推荐
网页和浏览器兼容性问题汇总(draft1)
Jun 01 Javascript
JavaScript希尔排序、快速排序、归并排序算法
May 08 Javascript
bootstrap daterangepicker汉化以及扩展功能
Jun 15 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
Jun 17 Javascript
[js高手之路]原型式继承与寄生式继承详解
Aug 28 Javascript
vue.js简单配置axios的方法详解
Dec 13 Javascript
vue将对象新增的属性添加到检测序列的方法
Feb 24 Javascript
vue路由守卫+登录态管理实例分析
May 21 Javascript
Angular6项目打包优化的实现方法
Dec 15 Javascript
js实现div色块碰撞
Jan 16 Javascript
JavaScript canvas绘制渐变颜色的矩形
Feb 18 Javascript
浅谈react useEffect闭包的坑
Jun 08 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 Ajax乱码
2008/04/09 PHP
php 魔术方法使用说明
2009/10/20 PHP
yii2 开发api接口时优雅的处理全局异常的方法
2019/05/14 PHP
PHP获取类私有属性的3种方法
2020/09/10 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
JavaScript中的Location地址对象
2008/01/16 Javascript
js计算页面刷新的次数
2009/07/20 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
jquery实现文字由下到上循环滚动的实例代码
2013/08/09 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
简单实现js选项卡切换效果
2017/02/09 Javascript
TableSort.js表格排序插件使用方法详解
2017/02/10 Javascript
用vue写一个仿简书的轮播图的示例代码
2018/03/13 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
javascript实现5秒倒计时并跳转功能
2019/06/20 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
django rest framework vue 实现用户登录详解
2019/07/29 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
关于Keras Dense层整理
2020/05/21 Python
国际书籍零售商:Wordery
2017/11/01 全球购物
朗仕(Lab series)英国官网:雅诗兰黛集团男士专属护肤品牌
2017/11/28 全球购物
DOUGLAS荷兰:购买香水和化妆品
2020/10/24 全球购物
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
质量标语大全
2014/06/12 职场文书
教师党员整改措施
2014/10/24 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
收入证明申请书
2015/06/12 职场文书
小学运动会通讯稿
2015/07/18 职场文书
2016年党课培训学习心得体会
2016/01/07 职场文书