作为 thunk 的动作创建者如何接收商店的调度方法?

How does action creator which is a thunk receive a store's dispatch method?

提问人:bakrall 提问时间:2/19/2023 最后编辑:bakrall 更新时间:2/20/2023 访问量:37

问:

我正在学习 redux,关于内部逻辑,有一件事让我感到困惑 - 如果 thunk 是参数,反之亦然,那么 thunk 如何接收作为参数?下面是一个示例代码:dispatchdispatch

我正在创建一个动作创建器,它是一个 thunk(它不返回一个动作本身,而是另一个最终返回动作的函数)。我将其定义为接收函数作为参数,如下所示(代码被简化为示例):dispatch

export const fetchPosts = () => {
   return async (dispatch) => {
     const response = await fetch('some url');

     dispatch({type: 'FETCH_POSTS', payload: response});
   }
}

然后,当我从“react-redux”获取函数时,我在 App.js 文件中使用这个 thunk:dispatch

import { useDispatch } from 'react-redux';
import { fetchPosts } from './store/posts-actions';

function App() {
  const dispatch = useDispatch();

  useEffect(() => {
      dispatch(fetchPosts());
  },[dispatch]);

  ...
}

我不是在作为论据传递给.我正在传递.这是我不明白的部分。dispatchfetchPosts()fetchPosts()dispatch

如果 receive as argument if 是参数,反之亦然,如何接收作为参数?fetchPostsdispatchfetchPostsdispatch

reactjs redux thunk

评论


答:

0赞 markerikson 2/20/2023 #1

这在 Redux 文档页面中进行了介绍,内容涉及使用 Thunks 和 Redux Fundamentals,第 6 部分:异步逻辑和数据获取

Redux thunk 中间件会查找函数被传入的任何时间,拦截该函数,然后将其作为参数调用:dispatch(dispatch, getState)

// standard middleware definition, with 3 nested functions:
// 1) Accepts `{dispatch, getState}`
// 2) Accepts `next`
// 3) Accepts `action`
const thunkMiddleware =
  ({ dispatch, getState }) =>
  next =>
  action => {
    // If the "action" is actually a function instead...
    if (typeof action === 'function') {
      // then call the function and pass `dispatch` and `getState` as arguments
      return action(dispatch, getState)
    }

    // Otherwise, it's a normal action - send it onwards
    return next(action)
  }