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 相关文章推荐
用jscript实现列出安装的软件列表
Jun 18 Javascript
js利用与或运算符优先级实现if else条件判断表达式
Apr 15 Javascript
js操作label给label赋值及取label的值示例
Nov 07 Javascript
JSON字符串和对象之间的转换详解
May 26 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
Nov 25 Javascript
jQuery插件实现适用于移动端的地址选择器
Feb 18 Javascript
深入学习AngularJS中数据的双向绑定机制
Mar 04 Javascript
Backbone View 之间通信的三种方式
Aug 09 Javascript
jquery实现页面加载效果
Feb 21 Javascript
Vuejs入门教程之Vue生命周期,数据,手动挂载,指令,过滤器
Apr 19 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
Aug 11 Javascript
原生JS无缝滑动轮播图
Oct 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
文件系统基本操作类
2006/11/23 PHP
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
递归删除一个节点以及该节点下的所有节点示例
2014/03/19 PHP
php跨服务器访问方法小结
2015/05/12 PHP
utf-8编码引起js输出中文乱码的解决办法
2010/06/23 Javascript
javascript event 事件解析
2011/01/31 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
innerHTML,outerHTML,innerText,outerText的用法及区别解析
2013/12/16 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
原生JS实现九宫格抽奖效果
2017/04/01 Javascript
js实现按座位号抽奖
2017/04/05 Javascript
基于angular实现模拟微信小程序swiper组件
2017/06/11 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
JavaScript中创建原子的方法总结
2018/08/26 Javascript
基于vue2.0的活动倒计时组件countdown(附源码下载)
2018/10/09 Javascript
微信小程序日历效果
2018/12/29 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
JS猜数字游戏实例讲解
2020/06/30 Javascript
python使用win32com在百度空间插入html元素示例
2014/02/20 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
python使用requests模块实现爬取电影天堂最新电影信息
2019/04/03 Python
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
员工自我鉴定范文
2013/10/06 职场文书
计算机售后服务承诺书
2014/05/30 职场文书
乡镇保密工作承诺书
2015/05/04 职场文书
政工师工作总结2015
2015/05/26 职场文书
交通安全温馨提示语
2015/07/14 职场文书
苹果发布了MagSafe固件更新,可以不外接电源实现最高7.5W充电
2022/04/21 数码科技