redux中间件之redux-thunk的具体使用

作者:Yangzhedi 时间:2024-05-02 17:21:54 

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

来源:https://juejin.im/post/5ad49b595188255c637b6ecc

标签:redux,中间件
0
投稿

猜你喜欢

  • openCV实现图像融合的示例代码

    2022-05-20 03:28:16
  • MySQL索引数据结构入门详细教程

    2024-01-25 02:02:42
  • python中利用h5py模块读取h5文件中的主键方法

    2022-07-26 12:02:36
  • pandas || df.dropna() 缺失值删除操作

    2023-07-10 06:51:06
  • python实现复制整个目录的方法

    2023-04-08 18:14:47
  • 浅谈Python数学建模之线性规划

    2021-02-11 17:57:35
  • Python打印输出数组中全部元素

    2022-08-07 19:35:12
  • Go中的应用配置管理详解

    2023-06-21 00:40:55
  • JavaScript数组去重的几种方法

    2024-04-18 10:56:33
  • python匹配两个短语之间的字符实例

    2022-08-31 04:49:57
  • matlab和Excel的数据交互操作(非xlsread和xlswrite)

    2022-06-16 01:00:42
  • 九步学会Python装饰器

    2021-04-05 15:35:07
  • python非标准时间的转换

    2022-04-12 17:37:52
  • 在ASP处理程序时,进度显示

    2008-08-04 13:27:00
  • Python Web版语音合成实例详解

    2021-11-28 04:37:20
  • python 移除字符串尾部的数字方法

    2023-03-18 19:38:21
  • js调用flash代码

    2010-01-23 12:35:00
  • 用 iframe 解决下拉框与层之冲突

    2008-04-28 12:24:00
  • python开发之文件操作用法实例

    2022-08-07 02:03:45
  • sqlserver 使用SSMS运行sql脚本的六种方法

    2024-01-15 14:51:11
  • asp之家 网络编程 m.aspxhome.com