【redux篇】middleware 之 redux-thunk
【redux篇】middleware 之 redux-thunk
之前每件事都差不多,直到现在才发现差很多。现在才发现理清一件事的原委是多么快乐的一件事,我们共同勉励。
懒得扯淡,直接正题
不基于例子的讲原理都是扯淡,知乎一样的举例都是卖弄
redux-thunk 函数签名
middleware 接受 Store 的 dispatch 和 getState 函数作为命名参数,并返回一个函数。该函数会被传入 被称为 next 的下一个 middleware 的 dispatch 方法,并返回一个接收 action 的新函数,这个函数可以直接调用 next(action),或者在其他需要的时刻调用,甚至根本不去调用它。调用链中最后一个 middleware 会接受真实的 store 的 dispatch 方法作为 next 参数,并借此结束调用链。
({ getState, dispatch }) => next => action
在写redux时,经常会使用中间件 redux-thunk 和 redux-promise 等,在使用 redux-thunk 时,经常对 dispatch 一个函数很有疑问,action 返回的函数中的参数 dispatch 和 getState 是怎么传递进来的。
源码分析
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;
从上面的源码可以看到在函数内部:
- 如果 action 是一个函数,则调用 dispatch 的 action 函数,传递 dispatch 和 getState;
- 如果 action 是一个对象,直接调用 dispatch action。
由此可见 redux-thunk 既可以处理函数也可以处理对象。