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 相关文章推荐
自制基于jQuery的智能提示插件一枚
Feb 18 Javascript
JQueryEasyUI Layout布局框架的使用
Apr 08 Javascript
jquery cookie实现的简单换肤功能适合小网站
Aug 25 Javascript
24款热门实用的jQuery插件推荐
Dec 24 Javascript
javascript实现鼠标放上后下边对应内容变换的效果
Aug 06 Javascript
谷歌Chrome浏览器扩展程序开发小记
Jan 06 Javascript
js实现select二级联动下拉菜单
Apr 17 Javascript
bootstrap快速制作后台界面
Dec 05 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
Mar 02 Javascript
vue2实现可复用的轮播图carousel组件详解
Nov 27 Javascript
浅析Angular19 自定义表单控件
Jan 31 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
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操作Access类(PHP+ODBC+Access)
2007/01/02 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
2017/06/07 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
stripos函数知识点实例分享
2019/02/11 PHP
Laravel 模型关联基础教程详解
2019/09/17 PHP
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
AngularJS使用自定义指令替代ng-repeat的方法
2016/09/17 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
Vue之Watcher源码解析(1)
2017/07/19 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
Vue render深入开发讲解
2018/04/13 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
Vue中的异步组件函数实现代码
2018/07/20 Javascript
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
layui动态加载多表头的实例
2019/09/05 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
selenium如何定位span元素的实现
2021/01/13 Python
某公司的.net工程师面试题笔试题
2013/11/22 面试题
公司优秀员工获奖感言
2014/08/14 职场文书
2014年租房协议书范本
2014/10/30 职场文书
工作经验交流材料
2014/12/30 职场文书
赔偿协议书
2015/01/27 职场文书
走近毛泽东观后感
2015/06/04 职场文书
三八节活动简报
2015/07/20 职场文书
2016教师校本研修心得体会
2016/01/08 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript
MYSQL如何查看操作日志详解
2022/05/30 MySQL