我可以在没有Redux Thunk中间件的情况下发送多个动作吗?

时间:2016-02-18 22:04:04

标签: javascript redux redux-thunk

我读到Redux Thunk是管理异步操作/请求的可靠方法。其他行动的调度行动并不多。

如何调度同步动作? 我不确定thunk方法的性能问题,但是我可以在其他动作创建者中调度动作而不在其中定义函数吗?

在我看来,使用redux thunk对于这种需求是不必要的。

3 个答案:

答案 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)

如果this完成,那么是,使用:

store.dispatch(action1, action2)

也许在github上+1?