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

Raf*_*ski 23 javascript redux redux-thunk

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

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

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

Dan*_*mov 37

显示和隐藏通知确实似乎是一个很好的用例.

David的回答描述了为响应某些事情而进行多次更新的"默认"方式:从不同的reducer处理它.这通常是你想要做的.

有时(与通知一样)它可能不方便.我将介绍如何在我对这个问题的回答中选择一个或多个动作进行选择.

在情况下,当你决定派遣多个动作,或者只是做连续地从你的组件,或使用终极版咚.请注意,如果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
Run Code Online (Sandbox Code Playgroud)

使用Redux Thunk不会有任何性能问题.这只是一种调用函数的好方法,你可以将dispatch它们交给你,这样他们就可以根据自己的需要多次调用.

  • 我应该如何实现第二次调度仅在第一次调度完成转换状态时才开始的要求? (4认同)

Dav*_*lsh 17

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

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

相反,两种不同的行为可能会导致相同的状态变化.

function firstReducer(state, action) {
    switch (action.type) {
        case ACTION_X:
        case ACTION_Y:
            // handle action x and y in the same manner
    }
}
Run Code Online (Sandbox Code Playgroud)

以相同的方式处理两个动作可能看起来很奇怪,但这只是在单个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
    }
}
Run Code Online (Sandbox Code Playgroud)

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