这个问题已经有答案了:
Why getPosts() is called within dispatch parentheses? How dispatch is working here?(1个答案)
11天前关闭
我正在编写一个React Redux教程。items.js有下面的代码。为什么要使用嵌套函数?我可以将item和dispatch作为one函数的参数传递。items.js的原始代码和我的想法在底部。请详细说明。先谢了。
export const addItem = (item) => (dispatch) => {
axios.post('/api/items', item)
.then(res => {
dispatch({
type: ADD_ITEM,
payload: res.data
});
})
.catch(err => {
dispatch(returnErrors(err.response.data, err.response.status));
});
}
export const addItem = (item, dispatch) => {
axios.post('/api/items', item)
.then(res => {
dispatch({
type: ADD_ITEM,
payload: res.data
});
})
.catch(err => {
dispatch(returnErrors(err.response.data, err.response.status));
});
}
1条答案
按热度按时间ff29svar1#
你的教程太过时了。现代Redux不使用ACTION_TYPES,thunks(如示例中所示)通常不再以这种形式编写,您可能不需要axios,现在很少需要thenable符号。请改为the official Redux tutorial。
(你可能会看到更多的差异,比如reducer没有被写为
switch..case
函数等,但这不在你的代码示例中-但你基本上是在写2019年之前的Redux)关于您的问题:在你的例子中,高阶函数是一个创建“thunk”的函数,这是一个特殊的可分派Redux操作的函数形式。因此,它更像是一个“动作创建器函数”,而不是一个“双参数函数”。
通过调用
dispatch(addItem(item))
来使用thunk,然后Redux本身将执行生成的thunk。addItem(item, dispatch)
作为一种符号在Redux中并没有被建立为一种模式,你最终会得到一个其他人无法轻松理解的代码库。此外,形实转换程序可以读取存储内容,因为形实转换程序的完整签名是
(dispatch, getState, extraArgument) => { /* do something */ }
-如果您要以自己的风格编写,您最终会调用addItem(item, dispatch, getState, extra)
,而不是只执行dispatch(addItem(item))
并让Redux完成其余工作。