redux中间件之redux-thunk的具体使用


Posted in Javascript onApril 17, 2018

redux的核心概念其实很简单:将需要修改的state都存入到store里,发起一个action用来描述发生了什么,用reducers描述action如何改变state tree 。创建store的时候需要传入reducer,真正能改变store中数据的是store.dispatch API。

1.概念

dispatch一个action之后,到达reducer之前,进行一些额外的操作,就需要用到middleware。你可以利用 Redux middleware 来进行日志记录、创建崩溃报告、调用异步接口或者路由等等。
换言之,中间件都是对store.dispatch()的增强

2.中间件的用法

import { applyMiddleware, createStore } from 'redux';
import thunk from 'redux-thunk';

const store = createStore(
  reducers, 
  applyMiddleware(thunk)
);

直接将thunk中间件引入,放在applyMiddleware方法之中,传入createStore方法,就完成了store.dispatch()的功能增强。即可以在reducer中进行一些异步的操作。

3.applyMiddleware()

其实applyMiddleware就是Redux的一个原生方法,将所有中间件组成一个数组,依次执行。

中间件多了可以当做参数依次传进去

const store = createStore(
  reducers, 
  applyMiddleware(thunk, logger)
);

如果想了解它的演化过程可以去redux的官方文档:https://redux.js.org/advanced/middleware

4.redux-thunk

分析redux-thunk的源码node_modules/redux-thunk/src/index.js

function createThunkMiddleware(extraArgument) {
 return ({ dispatch, getState }) => next => action => {
  if (typeof action === 'function') {
   return action(dispatch, getState, extraArgument);
  }

  return next(action);
 };
}

const thunk = createThunkMiddleware();
thunk.withExtraArgument = createThunkMiddleware;

export default thunk;

redux-thunk中间件export default的就是createThunkMiddleware()过的thunk,再看createThunkMiddleware这个函数,返回的是一个柯里化过的函数。我们再翻译成ES5的代码容易看一点,

function createThunkMiddleware(extraArgument) {
  return function({ dispatch, getState }) {
    return function(next){
      return function(action){
        if (typeof action === 'function') {
          return action(dispatch, getState, extraArgument);
        }

        return next(action);
      };
    }
  }
}

这么一看,就可以看出来redux-thunk最重要的思想,就是可以接受一个返回函数的action creator。如果这个action creator 返回的是一个函数,就执行它,如果不是,就按照原来的next(action)执行。

正因为这个action creator可以返回一个函数,那么就可以在这个函数中执行一些异步的操作。

例如:

export function addCount() {
  return {type: ADD_COUNT}
}

export function addCountAsync() {
  return dispatch => {
    setTimeout( () => {
      dispatch(addCount())
    },2000)
  }
}

addCountAsync函数就返回了一个函数,将dispatch作为函数的第一个参数传递进去,在函数内进行异步操作就可以了。

参考文档:http://www.redux.org.cn/docs/advanced/Middleware.html

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
Dec 27 Javascript
在JavaScript中监听IME键盘输入事件
May 29 Javascript
javascript学习笔记(五)原型和原型链详解
Oct 08 Javascript
jQuery图片轮播滚动切换代码分享
Apr 20 Javascript
基于Jquery easyui 选中特定的tab
Nov 17 Javascript
Bootstrap媒体对象的实现
May 01 Javascript
javascript 注释代码的几种方法总结
Jan 04 Javascript
JavaScript实现图像模糊化的方法实例
Jan 15 Javascript
javascript实现简易计算器
Feb 01 Javascript
详解Js中的模块化是如何实现的
Oct 18 Javascript
jquery select插件异步实时搜索实例代码
Oct 20 jQuery
Angular短信模板校验代码
Sep 23 Javascript
Vue进度条progressbar组件功能
Apr 17 #Javascript
微信小程序如何像vue一样在动态绑定类名
Apr 17 #Javascript
Angular数据绑定机制原理
Apr 17 #Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
Apr 17 #Javascript
jQuery实现使用sort方法对json数据排序的方法
Apr 17 #jQuery
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
Apr 17 #jQuery
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
Apr 17 #jQuery
You might like
php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
2006/11/17 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
2014/05/08 PHP
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
2007/03/24 Javascript
js截取函数(indexOf,join等)
2010/09/01 Javascript
异步动态加载JS并运行(示例代码)
2013/12/13 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
JS访问SWF的函数用法实例
2015/07/01 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
vue 请求后台数据的实例代码
2017/06/22 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
JS实现点击下拉菜单把选择的内容同步到input输入框内的实例
2018/01/23 Javascript
vue实现自定义多选与单选的答题功能
2018/07/05 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
Vue数据绑定简析小结
2019/05/07 Javascript
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
小程序新版订阅消息模板消息
2019/12/31 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
python getopt 参数处理小示例
2009/06/09 Python
Python中的高级数据结构详解
2015/03/27 Python
浅析Python中signal包的使用
2015/11/13 Python
Python的shutil模块中文件的复制操作函数详解
2016/07/05 Python
快速了解python leveldb
2018/01/18 Python
Python搭建FTP服务器的方法示例
2018/01/19 Python
解决Django migrate不能发现app.models的表问题
2019/08/31 Python
大三预备党员入党思想汇报
2014/01/08 职场文书
4s店销售经理岗位职责
2014/07/19 职场文书
2015年质量月活动总结报告
2015/03/27 职场文书
2015年青年志愿者工作总结
2015/05/20 职场文书