我可以在没有Redux Thunk中间件的情况下调度多个操作吗?

19 浏览
0 Comments

我可以在没有Redux Thunk中间件的情况下调度多个操作吗?

我读到Redux Thunk是管理异步操作/请求的可靠方法。没有太多关于通过其他操作来调度操作的内容。

对于调度同步操作怎么样?

我不确定thunk方法的性能问题,但我可以不在内部定义函数的情况下在其他操作创建者内部分派操作吗?

对我来说,似乎使用redux巨兽对于这种需要是不必要的。

admin 更改状态以发布 2023年5月23日
0
0 Comments

将操作转换为状态改变的一对一关系是错误的想法。实际上,它们是多对多的。要记住,所有操作都会对所有减速器调用。

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

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

在同一个减速器的语境下,以相同的方式处理两个操作似乎很奇怪,但其他减速器可以自由地以不同的方式处理它们。

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

由于这种多对多的关系,拥有操作层次结构是不必要的。如果您有操作创建者触发多个同步操作,那么您的代码变得更加复杂且更难理解。

0
0 Comments

显示和隐藏通知确实是使用thunk的一个好例子。

David的答案描述了响应某些内容执行多个更新的“默认”方式:从不同的reducers处理。大多数情况下,这就是你要做的。

有时(比如通知),这可能不方便。在我回答此问题中,我描述了如何在派发一个或多个actions之间进行选择。

在你决定派发多个actions时,可以从你的组件中按顺序执行,或者使用Redux Thunk。请注意,如果Redux Thunk对你来说很神秘,你应该在使用之前了解它的真正用途。它只在代码组织方面提供了一些好处;实际上,它与你自己连续两次运行dispatch()没有任何区别。

也就是说,使用Redux Thunk派发多个actions的示例如下:

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,让它们可以随意执行。

0