不用redux-thunk之前

// store.js
import { createStore } from 'redux';export const reducer = (state = {count: 0
}, action) => {switch(action.type) {case 'CHANGE_DATA': {return {...state,count: action.data}}default: return state;}
}
export const store = createStore(reducer);
// App.jsx
class ReduxTest extends React.Component {constructor(props) {super(props);store.subscribe(() => {console.log('subscribe')this.setState({count: store.getState().count})})}changeData = () => {const { count } = store.getState();const action = {type: 'CHANGE_DATA',data: count + 1}store.dispatch(action);}render() {return (<div><span>{this.state?.count}</span><button onClick={this.changeData}>按钮+1</button></div>)}
}
export default ReduxTest;

对于上述代码,我们dispatch一个action,其中action必须为一个对象。

但是实际开发中,action里的数据往往是一个异步接口获取的数据,这个时候,我们可以

class ReduxTest extends React.Component {constructor(props) {super(props);store.subscribe(() => {console.log('subscribe', store.getState());this.setState({count: store.getState().count});});}changeData = () => {const { count } = store.getState();let res;const p = new Promise(resolve => {setTimeout(() => {res = 111;resolve(res);}, 1000);});p.then(r => {const action = {type: 'CHANGE_DATA',data: r};store.dispatch(action);});};render() {return (<div><span>{this.state?.count}</span><button onClick={this.changeData}>按钮+1</button></div>);}
}
export default ReduxTest;

但是,上述会把处理的异步的逻辑写在组件里,使代码变得混乱,
因此,假如我dispatch一个函数,在这个函数里去处理异步的逻辑,岂不是使代码变得更简洁?!

const getData = () => {let res;const p = new Promise(resolve => {setTimeout(() => {res = 111;resolve(res);}, 1000);});p.then(r => {const action = {type: 'CHANGE_DATA',data: r};store.dispatch(action);});
};
class ReduxTest extends React.Component {constructor(props) {super(props);store.subscribe(() => {console.log('subscribe', store.getState());this.setState({count: store.getState().count});});}changeData = () => {const { count } = store.getState();store.dispatch(getData);};render() {return (<div><span>{this.state?.count}</span><button onClick={this.changeData}>按钮+1</button></div>);}
}
export default ReduxTest;

这样,就将组件和异步处理逻辑进行了解耦。

总结:

其实没有redux-thunk,也可以完成同样的功能,只是将处理异步逻辑的代码写在组件里,为了让代码更简洁、解耦,所以通过redux-thunk可以dispatch一个函数,然后在这个函数里处理异步操作。
redux-thunk 源码参考:https://segmentfault.com/a/1190000022792225

redux-thunk 源码解读相关推荐

  1. Redux 源码解读 —— 从源码开始学 Redux

    已经快一年没有碰过 React 全家桶了,最近换了个项目组要用到 React 技术栈,所以最近又复习了一下:捡起旧知识的同时又有了一些新的收获,在这里作文以记之. 在阅读文章之前,最好已经知道如何使用 ...

  2. dva处理_dva 源码解读

    声明 本文章用于个人学习研究,并不代表 dva 团队的任何观点. 原文以及包含一定注释的代码见这里,若有问题也可以在这里进行讨论 起步 为什么是dva? 笔者对 dva 的源代码进行解读,主要考虑到 ...

  3. html 源码知识,源码解读

    用Node.js写一个web服务器,我前面已经写过两篇文章了: 第一篇是不使用任何框架也能搭建一个web服务器,主要是熟悉Node.js原生API的使用:使用Node.js原生API写一个web服务器 ...

  4. Bert系列(二)——源码解读之模型主体

    本篇文章主要是解读模型主体代码modeling.py.在阅读这篇文章之前希望读者们对bert的相关理论有一定的了解,尤其是transformer的结构原理,网上的资料很多,本文内容对原理部分就不做过多 ...

  5. Bert系列(三)——源码解读之Pre-train

    https://www.jianshu.com/p/22e462f01d8c pre-train是迁移学习的基础,虽然Google已经发布了各种预训练好的模型,而且因为资源消耗巨大,自己再预训练也不现 ...

  6. linux下free源码,linux命令free源码解读:Procps free.c

    linux命令free源码解读 linux命令free源码解读:Procps free.c 作者:isayme 发布时间:September 26, 2011 分类:Linux 我们讨论的是linux ...

  7. nodeJS之eventproxy源码解读

    1.源码缩影 !(function (name, definition) { var hasDefine = typeof define === 'function', //检查上下文环境是否为AMD ...

  8. Koa2和Redux中间件源码研究

    一.Koa2中间件源码分析 在Koa2中,中间件被存放在一个数组中. 使用koa中,最常见的就是app.use(fn),use函数部分源码如下所示.首先中间件必须是个函数.若是generator函数, ...

  9. PyTorch 源码解读之即时编译篇

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 作者丨OpenMMLab 来源丨https://zhuanlan.zhihu.com/ ...

  10. Alamofire源码解读系列(九)之响应封装(Response)

    本篇主要带来Alamofire中Response的解读 前言 在每篇文章的前言部分,我都会把我认为的本篇最重要的内容提前讲一下.我更想同大家分享这些顶级框架在设计和编码层次究竟有哪些过人的地方?当然, ...

最新文章

  1. vue变量传值_vue组件与组件之间传值
  2. 系统学习NLP(三)--NLP入门综述
  3. GSMA公布2016年亚洲移动大奖提名名单
  4. 病毒周报(100719至100725)
  5. Android移动开发之【通往安卓的神奇之旅】TextView和ImageView 实现跑马灯效果
  6. 对线程与进程的区别以及对多线程并发的理解
  7. 如何在用例之间传递值_接口测试:A12_HttpRunner_cookie整理_01_提取指定cookie值
  8. python修改密码业务_Python: 修改LDAP密码
  9. 好老婆的作息时间(做女人真悲哀 ……)
  10. IT NEWS WebSite
  11. kind富文本编辑器_kind富文本编辑器
  12. mysql无法通过工具连接_MySQL 8.0版本无法使用 node、Navicat等三方工具连接的问题...
  13. matlab输入一个正的实数x,VB程序题:用InputBox 输入一个正实数,用Pring方法在一行上显示出它的平方和平方根、立方和立方根,每个数保留三位小数,其间有间隔。...
  14. C#面向对象封装继承多态
  15. destoon php 循环语句,destoon二次开发模板及调用语法汇总_PHP
  16. Blazor 在开发环境保存机密(User Secrets)
  17. 超详细的Android APP 集成 PayPal 境外支付 信用卡 借记卡 支付,支付宝 微信海外 境外支付
  18. MySQL 冷备份操作 + shell 脚本自动备份
  19. 不同类型时钟CLK信号波形的产生、与时钟频率的关系
  20. visibility与display的区别:

热门文章

  1. Windows系统清理和加速工具Wise Care 365®5.6.5 Pro版
  2. 计算机网络三级——网络技术(一周复习)
  3. 玩转dream DSP芯片(1)
  4. 关闭对话框,OnClose和OnCancel
  5. 液压支架销轴力学计算分析研究_第45届等级奖论文---ZY4800/06/16.5D型薄煤层液压支架群组支护力学特性研究...
  6. JS数据类型lianxi
  7. 【信息安全】-- 知识点
  8. DuPont analysis chart-杜邦分析
  9. 攻防世界:PWN刷题-forgot
  10. 基础篇|信贷风控中的外部数据(百行)