Redux中Thunk类型的Action Creator如何接收store的dispatch方法?
Redux Thunk:为什么传入dispatch的函数能拿到dispatch参数?
核心原因是Redux Thunk中间件在后台做了拦截和参数注入,具体拆解如下:
先看你的调用逻辑:
你执行dispatch(fetchPosts())时,fetchPosts()返回的是那个async (dispatch) => { ... }函数——也就是说,你传给dispatch的不是普通的action对象,而是一个函数(也就是所谓的thunk)。Thunk中间件的拦截处理:
Redux默认的dispatch只能接收普通对象类型的action,但Thunk中间件会在dispatch执行前拦截调用,检查传入的参数类型:- 如果发现传入的是函数,它会自动把Redux的
dispatch(还有getState等可选参数)作为参数传给这个函数,然后执行它 - 如果是普通action对象,就直接交给Redux的原始dispatch流程处理
- 如果发现传入的是函数,它会自动把Redux的
结合你的代码看:
当你把fetchPosts()返回的async函数传给dispatch后,Thunk中间件识别出这是个函数,就会调用这个async函数,并把Redux的dispatch作为第一个参数传进去——这就是你的async函数里能拿到dispatch的原因,完全不需要你手动传入。
可以用一段简化版的Thunk中间件代码直观理解这个过程:
// 简化的Thunk中间件逻辑 const thunkMiddleware = store => next => action => { // 判断传入的action是否为函数 if (typeof action === 'function') { // 把dispatch和getState传给这个函数并执行 return action(store.dispatch, store.getState); } // 非函数则继续原始流程 return next(action); };
总结来说:你只需要把thunk函数传给dispatch,Thunk中间件会自动帮你把dispatch注入进去执行,这就是整个逻辑的核心。
内容的提问来源于stack exchange,提问作者bakrall
相关产品推荐
相关产品推荐

