我读到Redux Thunk是管理异步操作/请求的可靠方法。其他行动的调度行动并不多。
如何调度同步动作? 我不确定thunk方法的性能问题,但是我可以在其他动作创建者中调度动作而不在其中定义函数吗?
在我看来,使用redux thunk对于这种需求是不必要的。
答案 0 :(得分:35)
显示和隐藏通知indeed似乎是一个很好的用例。
David’s answer描述了为响应某些事情而进行多次更新的“默认”方式:从不同的reducer处理它。大多数情况下,这就是你想要做的事情。
有时(与通知一样)可能会带来不便。我将介绍如何在my answer to this question中分配一个或多个操作进行选择。
如果您执行决定分派多个操作,请从组件中按顺序执行,或使用Redux Thunk。请注意,如果Redux Thunk看起来很神秘,那么在使用之前你应该understand what it really is。它只提供代码组织方面的好处;实际上,与自己连续两次运行dispatch()
并没有什么不同。
也就是说,Redux Thunk调度多个动作如下所示:
function increment() {
return { type: 'INCREMENT' }
}
function incrementTwice() {
return dispatch => {
dispatch(increment())
dispatch(increment())
}
}
store.dispatch(increment())
incrementTwice()(store.dispatch) // doesn’t require redux-thunk but looks ugly
store.dispatch(incrementTwice()) // requires redux-thunk but looks nice
使用Redux Thunk不会出现任何性能问题。这只是一种调用函数的好方法,您可以将dispatch
移交给函数,以便他们可以根据需要多次执行。
答案 1 :(得分:16)
将行动变更为一对一的行为是错误的。它们实际上是多对多的。请记住,所有减速器都会调用所有操作。
例如,单个操作可能会触发多个状态更改:
function firstReducer(state, action) {
switch (action.type) {
case ACTION_X:
// handle action x
}
}
function secondReducer(state, action) {
switch (action.type) {
case ACTION_X:
// handle action x
}
}
function thirdReducer(state, action) {
switch (action.type) {
case ACTION_X:
// handle action x
}
}
相反,两种不同的行为可能导致相同的状态变化。
function firstReducer(state, action) {
switch (action.type) {
case ACTION_X:
case ACTION_Y:
// handle action x and y in the same manner
}
}
以相同的方式处理两个动作似乎很奇怪,但这只是在单个reducer的上下文中。其他减速器可以自由地处理它们。
function secondReducer(state, action) {
switch (action.type) {
case ACTION_X:
// handle action x
case ACTION_Y:
// handle action y
}
}
function thirdReducer(state, action) {
switch (action.type) {
case ACTION_X:
// handle action x
default:
// ignore action y
}
}
通过这种多对多的关系,根本没有必要拥有一个动作层次结构。如果你有动作创建者触发多个同步动作,你的代码会变得更复杂,更难以推理。
答案 2 :(得分:1)