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兼容标准的表格变色效果
Jun 28 Javascript
ie与ff下的event事件使用介绍
Nov 25 Javascript
基于javascript实现右下角浮动广告效果
Jan 08 Javascript
javascript实现checkbox复选框实例代码
Jan 10 Javascript
Angularjs2不同组件间的通信实例代码
May 06 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
Aug 21 Javascript
利用pm2部署多个node.js项目的配置教程
Oct 22 Javascript
ES6中字符串string常用的新增方法小结
Nov 07 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
May 23 Javascript
webpack打包多页面的方法
Nov 30 Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
Jan 16 Javascript
使用Node.js实现base64和png文件相互转换的方法
Mar 11 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
dedecms系统常用术语汇总
2007/04/03 PHP
PHP 数组黑名单/白名单实例代码详解
2019/06/04 PHP
JS location几个方法小姐
2008/07/09 Javascript
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
使用jquery读取html5 localstorage的值的方法
2013/01/04 Javascript
jQuery之ajax技术的详细介绍
2013/06/19 Javascript
Jquery性能优化详解
2014/05/15 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
JavaScript中for循环的使用详解
2015/06/03 Javascript
9种改善AngularJS性能的方法
2017/11/28 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
Vue.extend 编程式插入组件的实现
2019/11/18 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
2020/08/10 Javascript
Vue 修改网站图标的方法
2020/12/31 Vue.js
[00:34]DOTA2上海特级锦标赛 VG战队宣传片
2016/03/04 DOTA
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
浅谈Python爬取网页的编码处理
2016/11/04 Python
Python中模块string.py详解
2017/03/12 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
Python第三方库h5py_读取mat文件并显示值的方法
2019/02/08 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
Tensorflow读取并输出已保存模型的权重数值方式
2020/01/04 Python
sklearn+python:线性回归案例
2020/02/24 Python
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
初中地理教学反思
2014/01/11 职场文书
班干部竞选演讲稿
2014/04/24 职场文书
小学学校门卫岗位职责
2014/08/03 职场文书
软件测试专业推荐信
2014/09/18 职场文书
质量承诺书格式范文
2015/04/28 职场文书
孔繁森观后感
2015/06/10 职场文书
2019同学聚会主持词
2019/05/06 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
慰问信(范文3篇)
2019/10/23 职场文书