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 checkbox全选、取消全选、删除功能代码
Dec 19 Javascript
潜说js对象和数组
May 25 Javascript
jquery动态添加元素事件失效问题解决方法
May 23 Javascript
JavaScript插件化开发教程(六)
Feb 01 Javascript
js实现鼠标经过时图片滚动停止的方法
Feb 16 Javascript
Jquery日历插件制作简单日历
Oct 28 Javascript
JavaScript动态检验密码强度的实现方法
Nov 09 Javascript
vue-cli初始化项目中使用less的方法
Aug 09 Javascript
RequireJS用法简单示例
Aug 20 Javascript
解决layer.prompt无效的问题
Sep 24 Javascript
JavaScript遍历数组的方法代码实例
Jan 14 Javascript
详解如何解决使用JSON.stringify时遇到的循环引用问题
Mar 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的全局错误处理详解
2016/04/25 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
jQuery $.extend()用法总结
2014/06/15 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
ES6新特性六:promise对象实例详解
2017/04/21 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
jQuery插件实现图片轮播效果
2020/10/19 jQuery
react+antd 递归实现树状目录操作
2020/11/02 Javascript
python中dir函数用法分析
2015/04/17 Python
利用Python爬取微博数据生成词云图片实例代码
2017/08/31 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
Python实现提取XML内容并保存到Excel中的方法
2018/09/01 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
通过实例解析Python调用json模块
2019/12/11 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
同学会邀请书大全
2014/01/12 职场文书
实验室标语
2014/06/21 职场文书
学校法制宣传月活动总结
2014/07/03 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书