我想我在这里错过了一个基本的理解。我知道为了创建一个动作并因此引发redux事件链,必须使用dispatch
调用动作创建者。
但是,当我们有一个redux-thunk返回一个函数,它会在我们的动作创建器上调用dispatch
时,为什么还必须使用dispatch
调用redux-thunk?
例如,请使用以下redux-thunk:
function savePerson(person: Person) {
return async (dispatch: any) => {
delete person.cars;
let newPerson = await axios.post('/api/people/addPeron', person);
dispatch(addPersonSuccess(person));
}
}
在没有dispatch
的情况下调用此savePerson函数不会引发redux流,我不明白为什么考虑它返回的函数会调用我们的动作创建者dispatch
。任何人都可以澄清我在这里失踪的东西吗?
答案 0 :(得分:2)
所有redux中间件都遵循相同的总体布局:
const middleware => store => next => action => next(action);
为什么还必须使用
dispatch
调用redux-thunk?
就像你在第一段中正确指出的那样,对于要由redux中间件链评估的动作/ thunk,它必须由调用代码dispatch
编辑。
我认为误解就在这里:
“...当我们有一个redux-thunk返回一个将要执行的函数时 致电我们的行动创造者......“。
虽然返回的函数调度动作是正确的,但它只是故事的一半。从技术上讲,您要发送两次:第一个savePerson
和更晚addPersonSuccess
。前者是一个笨蛋,后者很可能是一个简单的行动。
现在,让我们考虑当前的redux-thunk
source code:
function createThunkMiddleware(extraArgument) {
return ({ dispatch, getState }) => next => action => {
if (typeof action === 'function') {
return action(dispatch, getState, extraArgument);
}
return next(action);
};
}
...
export default thunk;
分发savePerson
后,中间件会将您的操作识别为功能。然后它注入dispatch
作为第一个参数,以便稍后允许调度其他操作。到目前为止,您的dispatch
操作尚未调用addPersonSuccess
。只有在异步调用添加人员之后,才会在addPersonSuccess
上调用调度。
我喜欢把它想象为在thunk中传递redux上下文(dispatch,getState等)。
参考