反应操作如何有权调度?



在我的反应项目中,我有一个看起来像这样的动作文件:

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

所以在这个例子中,我知道调度来自middlewaregetContents可以访问它,因为它是使用mapDispatchToProps映射的。所以我假设当调用getContents时,它真的是这样称呼的 ->dispatch(getContents)但这可以在普通的 JavaScript 中复制,这样我就能看到到底发生了什么?如果我错了为什么getContents可以访问dispatch请告诉我。

例如,startLoad如何仅仅因为dispatch被称为startLoad而能够使用dispatch?我注意到如果我这样称呼它,它也会起作用:dispatch(startLoad(dispatch));.

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

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

const fun = () => (fun2) => {
fun2();
}
const fun2 = () => {
console.log('hello');
}
fun()(fun2);
所以我

假设当调用getContent时,它真的叫像 这个 -> 调度(getContent(,但这可以用普通文复制吗 JavaScript 这样我就能看到到底发生了什么?如果我错了 为什么getContent可以访问调度,请告诉我。

redux-thunk的实现非常简单

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

如您所见,它会检查操作是否为函数。

奖金,如果你愿意,你可以在调度后在参数中获得整个状态和额外的参数

例如,isstartLoad 如何使用调度,因为 调度称为启动加载?我注意到它也可以工作,如果我 这样称呼它:dispatch(startLoad(dispatch((;。

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

最新更新