重置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脚本性能的优化方法
Feb 02 Javascript
用javascript编写的第一人称射击游戏
Feb 25 Javascript
javascript for循环从入门到偏门(效率优化+奇特用法)
Aug 01 Javascript
百度地图自定义控件分享
Mar 04 Javascript
JavaScript中日期函数的相关操作知识
Aug 03 Javascript
学习掌握JavaScript中this的使用技巧
Aug 29 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
Oct 13 Javascript
js实现将json数组显示前台table中
Jan 10 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
Jan 10 Javascript
使用bootstrap插件实现模态框效果
May 10 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
Jul 19 Javascript
Vue搭建后台系统需要注意的问题
Nov 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 清除网页病毒的方法
2008/12/05 PHP
php 小乘法表实现代码
2009/07/16 PHP
PHP 柱状图实现代码
2009/12/04 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
浅析PHP的ASCII码转换类
2013/07/05 PHP
PHP中的闭包(匿名函数)浅析
2015/02/07 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
Jquery命名冲突解决的五种方案分享
2012/03/16 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
2014/05/12 Javascript
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
微信小程序之购物车功能
2020/09/23 Javascript
angularjs+bootstrap实现自定义分页的实例代码
2017/06/19 Javascript
Vue前后端不同端口的实现方法
2018/09/19 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
2019/07/24 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
vuex的数据渲染与修改浅析
2020/11/26 Vue.js
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
Python使用sorted对字典的key或value排序
2018/11/15 Python
Python 函数list&read&seek详解
2019/08/28 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
瑞士图书网站:Weltbild.ch
2019/09/17 全球购物
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
物理研修随笔感言
2014/02/14 职场文书
机电一体化求职信
2014/03/10 职场文书
学校安全责任书
2014/04/14 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
感恩节活动策划方案
2014/05/16 职场文书
小学生推普周国旗下讲话稿
2014/09/21 职场文书
幸福家庭事迹材料
2014/12/20 职场文书