重置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初学者应注意的七个细节详细介绍
Dec 27 Javascript
javascript确认框的三种使用方法
Dec 17 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
May 16 Javascript
JS实现可关闭的对联广告效果代码
Sep 14 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
Sep 18 Javascript
JS控制HTML元素的显示和隐藏的两种方法
Sep 27 Javascript
jQuery 特性操作详解及实例代码
Sep 29 Javascript
深入理解bootstrap框架之第二章整体架构
Oct 09 Javascript
js实现下拉菜单效果
Mar 01 Javascript
基于webpack4搭建的react项目框架的方法
Jun 30 Javascript
react中实现搜索结果中关键词高亮显示
Jul 31 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
Apr 23 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
肝肠寸断了解下!盘点史上最伤心的十大动漫
2020/03/04 日漫
杏林同学录(二)
2006/10/09 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
2014/06/23 PHP
JQuery操作表格(隔行着色,高亮显示,筛选数据)
2012/02/23 Javascript
js确定对象类型方法
2012/03/30 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
NodeJS实现客户端js加密
2017/01/09 NodeJs
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
使用use注册Vue全局组件和全局指令的方法
2018/03/08 Javascript
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
2019/06/14 Javascript
JavaScript代码异常监控实现过程详解
2020/02/17 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
python多线程编程方式分析示例详解
2013/12/06 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
对python中的argv和argc使用详解
2018/12/15 Python
Python Web版语音合成实例详解
2019/07/16 Python
Django如何将URL映射到视图
2019/07/29 Python
浅析PyTorch中nn.Module的使用
2019/08/18 Python
python3使用GUI统计代码量
2019/09/18 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
检测浏览器是否支持html5视频的代码
2013/03/28 HTML / CSS
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
美津浓巴西官方网站:Mizuno巴西
2019/07/24 全球购物
令人啧啧称赞的经理推荐信
2013/11/07 职场文书
大一新生军训时的自我评价分享
2013/12/05 职场文书
《母亲的恩情》教学反思
2014/02/13 职场文书
2014年五一活动策划方案
2014/03/15 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
建筑工程造价专业自荐信
2014/07/08 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
投诉信格式范文
2015/07/02 职场文书
2015年暑期见闻
2015/07/14 职场文书
为什么mysql字段要使用NOT NULL
2021/05/13 MySQL