所有的 redux 动作都应该有相应的 reducer 吗?

Posted

技术标签:

【中文标题】所有的 redux 动作都应该有相应的 reducer 吗?【英文标题】:Should all redux actions have a corresponding reducer? 【发布时间】:2020-06-08 16:58:27 【问题描述】:

我认为 Redux 对于调试非常有用,因为它可以跟踪您的应用在其开发工具中调度了哪些操作。调度一个动作而不打算用减速器处理它是不好的做法吗?

例如,我想进行 AJAX 调用并根据响应更新本地反应组件状态,但仍希望在开发工具中记录此调用以进行调试。我想创建一个动作创建器,使用 react-redux 的连接包装器中的 react-redux mapDispatchToProps 属性将其连接到我的组件,但我的 reducer 函数中从来没有处理这个动作的案例。

【问题讨论】:

我会说我也在这样做,但我还没有看到任何问题,只要你不想看动作是否成功,你不需要减速器。这就像运行一个没有返回值的函数。 【参考方案1】:

不一定。一个常见的例子是触发一个中间件拦截、解释的动作,并且根据动作的内容可能会或可能不会触发一个或多个后续动作,甚至可能吞下您触发的原始​​动作(即不会在链,因此它实际上从未到达任何减速器)。

无论它是否吞下动作,在很多情况下您只对中间件触发的后续动作感兴趣,因此无论如何可能不会在任何减速器中处理该原始动作。

这种模式可以在例如redux-promise-middleware中看到

但是,您在此处描述的用例纯粹出于记录目的而使用操作,我建议您不要这样做。这不是世界上最糟糕的事情,但实际上 Redux 操作应该做一些事情 - 使用它来记录发生了这样的事情可能是一种误用,并且过于混乱(想象有人维护这段代码,花一些时间试图弄清楚这个动作是否有任何作用,然后它没有做任何事情的事实是否是一个错误或故意等等)。只需使用console.log 就更加简单明了。

【讨论】:

以上是关于所有的 redux 动作都应该有相应的 reducer 吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Redux 中,如果所有 reducer 在动作触发时都被调用,那么是啥阻止了动作之间可能的命名冲突?

Redux - reducer 与动作的关系

Redux 中间件和reducer 之间的区别接受所有操作

React Redux:动作创建者不调用reducer

使用通用动作和减速器简化 redux

Redux - 调用一系列函数或reducer?