在了解了redux以及redux中间件的机制后,本篇文章想要聊聊在redux生态领域里十分流行的一款中间件:redux-thunk,废话不多说,开搞!

ppx2.jpg

什么是redux-thunk

我们都知道,在redux体系里,如果我们想在页面dispatch一个action,那么这个action必须是个 普通对象。因为在没有使用中间件的情况下,action是直接被 reducer 捕获的,而reducer要求action必须是一个 带type字段的普通对象,所以就有了这样的使用局限

inte.jpg

而redux-thunk则可以让我们dispatch一个 函数,从而可以更加灵活地使用action

redux的源码非常简洁:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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对于action为 function 的情况,会去 执行 这个函数action,同时传入关键参数 dispatchgetState,这样就可以让我们在无需 显示 传递state和dispatch的情况下,在我们自定义的函数action内,自由地dispatch和获取state

05e8d5935f9c446cb64badbef0f191cf_tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.jpg

使用redux-thunk的好处

其实从对redux-thunk的介绍中,我们就可以知道其优势所在,这里再做下总结

redux-thunk的不足

对于异步逻辑处理没有特别高要求的项目,redux-thunk是完全够用的,但是如果有这方面要求,那么redux-thunk是无法更精细地控制异步流程,而是只能简单地支持异步逻辑

这种需求下,redux-saga 则是更适合的一种方案,它提供了很多用于控制异步流程的api,有机会的话我会单独出一篇文章来讲解

结语

redux-thunk中的thunk,其实就是指的函数,也就说核心在于函数action的支持,从而大大提高了redux的使用灵活性,这也是它如此受欢迎的原因,而对于我们来说,重要的是领悟其中蕴含的思想,这样才可以不断将知识收入囊中,最终成为一个“富有”的人