我读到 Redux Thunk 是管理异步操作/请求的可靠方法。通过其他操作来调度操作没什么大不了的。
调度同步动作怎么样?我不确定 thunk 方法的性能问题,但我可以在其他动作创建者内部调度动作而不在内部定义函数吗?
在我看来,对于这种需要,使用 redux thunk 是不必要的。
我读到 Redux Thunk 是管理异步操作/请求的可靠方法。通过其他操作来调度操作没什么大不了的。
调度同步动作怎么样?我不确定 thunk 方法的性能问题,但我可以在其他动作创建者内部调度动作而不在内部定义函数吗?
在我看来,对于这种需要,使用 redux thunk 是不必要的。
显示和隐藏通知确实似乎是 thunk 的一个很好的用例。
David 的回答描述了针对某些事情进行多次更新的“默认”方式:从不同的 reducer 处理它。大多数情况下,这就是您想要做的。
有时(与通知一样)可能会带来不便。在我对这个问题的回答中,我描述了如何在调度一个或多个动作之间进行选择。
如果你决定调度多个操作,要么从你的组件按顺序执行,要么使用 Redux Thunk。请注意,如果 Redux Thunk 对您来说似乎很神秘,那么您应该在使用它之前了解它的真正含义。它仅在代码组织方面提供好处;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
,以便他们可以根据需要多次执行此操作。
将声明更改的操作视为一对一的操作是错误的。它们实际上是多对多的。请记住,所有操作都会在所有 reducer 上调用。
例如,单个操作可能会触发多个状态更改:
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
}
}
有了这种多对多的关系,就没有必要拥有动作层次结构了。如果您有动作创建者触发多个同步动作,您的代码将变得更加复杂且难以推理。