首页 文章

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

提问于
浏览
20

我读到Redux Thunk是管理异步操作/请求的可靠方法 . 没有太多关于通过其他行动调度行动的事情 .

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

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

3 回答

  • 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

    将行动变更为一对一的行为是错误的 . 它们实际上是多对多的 . 请记住,所有减少器都会调用所有操作 .

    例如,单个操作可能会触发多个状态更改:

    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
        }
    }
    

    有了这种多对多关系,就没有必要拥有一个动作层次结构 . 如果您有动作创建者触发多个同步操作,则您的代码会变得更复杂,更难以推理 .

  • 15

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

    store.dispatch(action1, action2)
    

    也许在github 1?

相关问题