React 操作如何访问调度?

问题描述 投票:0回答:1

在我的反应项目中,我有一个如下所示的操作文件:

const startLoad = () => async (dispatch) => {
  dispatch({
    type: CONTENT_LOAD,
  });
};

// Get all content
export const getContents = () => async (dispatch) => {
  dispatch(startLoad());
  // some more code...
};

所以在这个例子中,我知道调度来自

middleware
并且
getContents
可以访问它,因为它是使用
mapDispatchToProps
映射的。所以我假设当
getContents
被调用时,它实际上是这样调用的 ->
dispatch(getContents)
但是可以用纯 JavaScript 复制它,以便我可以看到到底发生了什么?如果我对
getContents
为何可以访问
dispatch
的理解有误,请告诉我。

例如,仅仅因为

startLoad
称为
dispatch
dispatch
就能够使用
startLoad
?我注意到,如果我这样称呼它,它也会起作用:
dispatch(startLoad(dispatch));

将调度传递给

startLoad
实际上对我来说更有意义,所以我不明白为什么不需要这样做。

编辑:这是我自己能想到的最接近的例子。

const fun = () => (fun2) => {
  fun2();
}

const fun2 = () => {
  console.log('hello');
}

fun()(fun2);
reactjs redux redux-thunk
1个回答
2
投票

所以我假设当 getContents 被调用时,它实际上被称为 this ->dispatch(getContents) 但这可以简单地复制吗 JavaScript 以便我可以看到到底发生了什么?如果我错了 为什么 getContents 可以访问调度,请告诉我。

redux-thunk 的实现非常简单

function createThunkMiddleware(extraArgument) {
  return ({ dispatch, getState }) => (next) => (action) => {
    if (typeof action === 'function') {
      return action(dispatch, getState, extraArgument);
    }

    return next(action);
  };
}

如您所见,它检查操作是否是一个函数。

还有额外的好处,如果您愿意,您可以在调度之后在参数中获取整个状态和额外参数

例如,isstartLoad 如何能够使用调度,只是因为 调度调用startLoad?我注意到它也会起作用,如果我 像这样调用它:dispatch(startLoad(dispatch));。

看起来中间件也可以处理上述情况。

© www.soinside.com 2019 - 2024. All rights reserved.