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 相关文章推荐
一个tab标签切换效果代码
Mar 27 Javascript
加随机数引入脚本不让浏览器读取缓存
Sep 04 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
Sep 13 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
Jan 09 Javascript
jQuery表单美化插件jqTransform使用详解
Apr 12 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
Jun 29 Javascript
漫谈JS引擎的运行机制 你应该知道什么
Jun 15 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
Oct 26 Javascript
微信小程序实战之轮播图(3)
Apr 17 Javascript
shiro授权的实现原理
Sep 21 Javascript
Vee-Validate的使用方法详解
Sep 22 Javascript
微信小程序非跳转式组件授权登录的方法示例
May 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
JAVA/JSP学习系列之四
2006/10/09 PHP
用PHP开发GUI
2006/10/09 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
JS模拟实现Select效果代码
2015/09/24 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
JavaScript字符串对象
2017/01/14 Javascript
JS 组件系列之BootstrapTable的treegrid功能
2017/06/16 Javascript
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
深入理解Promise.all
2018/08/08 Javascript
Vue中android4.4不兼容问题的解决方法
2018/09/04 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
[49:20]2014 DOTA2国际邀请赛中国区预选赛5.21 CIS VS TongFu
2014/05/22 DOTA
浅谈Python 字符串格式化输出(format/printf)
2016/07/21 Python
Python采用Django开发自己的博客系统
2020/09/29 Python
python开发利器之ulipad的使用实践
2017/03/16 Python
python requests使用socks5的例子
2019/07/25 Python
python使用matplotlib绘制雷达图
2019/10/18 Python
logging level级别介绍
2020/02/21 Python
基于css3仿造window7的开始菜单
2010/06/17 HTML / CSS
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
美丽的现代设计家具:2Modern
2018/07/26 全球购物
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
请介绍一下Ant
2016/07/22 面试题
2015年设计师个人工作总结
2015/04/25 职场文书
养成教育工作总结
2015/08/13 职场文书
2016年11月份红领巾广播稿
2015/12/21 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
教你用Python matplotlib库制作简单的动画
2021/06/11 Python
mysql 数据插入优化方法之concurrent_insert
2021/07/01 MySQL