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 相关文章推荐
五段实用的js高级技巧
Dec 20 Javascript
Javascript Throttle & Debounce应用介绍
Mar 19 Javascript
javascript中数组的sort()方法的使用介绍
Dec 18 Javascript
Ajax清除浏览器js、css、图片缓存的方法
Aug 06 Javascript
微信小程序 location API实例详解
Oct 02 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
Nov 29 Javascript
JS中的作用域链
Mar 01 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
Jun 19 Javascript
JavaScript Window窗口对象属性和使用方法
Jan 19 Javascript
JS面向对象编程——ES6 中class的继承用法详解
Mar 03 Javascript
javascript canvas时钟模拟器
Jul 13 Javascript
ES2020系列之空值合并运算符 '??'
Jul 22 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 header Content-Type类型小结
2011/07/03 PHP
神盾加密解密教程(三)PHP 神盾解密工具
2014/06/08 PHP
从wamp到xampp的升级之路
2015/04/08 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
Nigma vs Alliance BO5 第三场2.14
2021/03/10 DOTA
JS中 用户登录系统的解决办法
2013/04/15 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
2017/01/04 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
js实现各浏览器全屏代码实例
2018/07/03 Javascript
详解基于electron制作一个node压缩图片的桌面应用
2019/01/29 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
2019/06/25 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
python socket网络编程步骤详解(socket套接字使用)
2013/12/06 Python
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
python 实现客户端与服务端的通信
2020/12/23 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
2020/12/28 Python
金宝贝童装官网:Gymboree
2016/08/31 全球购物
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
医护人员英文求职信范文
2013/11/26 职场文书
留学推荐信写作指南
2014/01/25 职场文书
大家访活动实施方案
2014/03/10 职场文书
售后求职信范文
2014/03/15 职场文书
组工干部对照检查材料
2014/08/25 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
2014年安全员工作总结
2014/11/13 职场文书
年会主持人开场白台词
2015/05/29 职场文书
寒假生活随笔
2015/08/15 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL