Javascript 使用多个还原程序在Redux中侦听同一操作避免导入订单/cirulcar依赖性错误

Javascript 使用多个还原程序在Redux中侦听同一操作避免导入订单/cirulcar依赖性错误,javascript,import,redux,Javascript,Import,Redux,我一直在使用一种非常常见的“模块”模式进行Redux项目,其中负责单个状态片的动作集、动作创建者和动作处理程序被组合在一个文件中,从这些文件导出的还原器通过组合还原器合并到一个根还原器中 我已经成功地使用了这个模式,但是当我试图让模块监听其他模块导出的操作时,我遇到了一些非常微妙和恼人的错误 我第一次遇到这个问题时,模块a从模块B导入一个操作,模块B从模块a导入一个操作,从而创建了一个循环依赖关系。很好,可以理解,我可以忍受这种情况 但我也遇到过这样的情况,简单地从模块B中的模块A导入一个操作会

我一直在使用一种非常常见的“模块”模式进行Redux项目,其中负责单个状态片的动作集、动作创建者和动作处理程序被组合在一个文件中,从这些文件导出的还原器通过组合还原器合并到一个根还原器中

我已经成功地使用了这个模式,但是当我试图让模块监听其他模块导出的操作时,我遇到了一些非常微妙和恼人的错误

我第一次遇到这个问题时,模块a从模块B导入一个操作,模块B从模块a导入一个操作,从而创建了一个循环依赖关系。很好,可以理解,我可以忍受这种情况

但我也遇到过这样的情况,简单地从模块B中的模块A导入一个操作会导致该操作未定义——我假设是基于模块被合并器导入或消化的顺序,尽管我还没有计算出具体的方式(即使在rootReducer文件中模块A在模块B之前导入,有时也会发生这种情况)

所以我的问题是:在多个reducer中听相同的动作被认为是一种好的模式,还是应该避免?这似乎是Redux做事方式所鼓励的,但我可能遗漏了一些东西

举一个人为的例子,假设我想在我的应用程序中保存一个特定操作的运行日志,因此我有一个“日志”模块,它侦听所需的操作并根据需要更新其状态片

假设我有一个用户模块,该模块的开头是:

export const ADD_USER = 'ADD_USER';

export function addUser (user) {
  return {
    type: ADD_USER,
    user: user
  }
};
等等

然后,如果我想在添加新用户时登录,我可能会执行以下操作:

   import { ADD_USER } from './users';

   const ACTION_HANDLERS = {
    [ADD_USER]: (state, action) => {
       return [
         ...state,
         'Added user: ' + action.user.name
       ];
     }
   }
   const initialState = []
   export default function logReducer (state = initialState, action) {
      const handler = ACTION_HANDLERS[action.type]
      return handler ? handler(state, action) : state
   }
大多数情况下,这种方法工作正常。但有时在导入时添加用户将未定义,因此操作处理程序将(悄悄地)错过该操作。非常烦人

如果这确实是一种方法,我应该如何避免这些错误?显而易见的解决方案似乎是将action const放在一个actions.js文件中,该文件在所有模块之前导入,但这似乎违背了模块化的观点。另一种选择是只编写如下操作处理程序:

ADD_USER: (state, action) => {}

听音乐时"“外部”操作。但为什么要将它们定义并导出为常量呢?

是的,Redux绝对鼓励让多个还原程序响应相同的操作。这就是为什么典型的基本Redux文件结构确实会为操作常量创建单独的文件-它们可以由多个单独的还原程序文件导入,并且可能是由多个单独的还原程序文件导入单独的action creator文件

“ducks”或“modules”结构在某种程度上是流行的,当然是组织代码的一种有效方法,但也基于这样一种想法,即只有一组简化程序会响应给定的操作spec确实建议从一个模块导出动作常量,这意味着您实际上不会有这些相互依赖关系,因为没有其他模块会/应该关心另一个模块中发生的事情

<> P.> ReDux的创建者Dan Abramov是一个很有价值的倡导者,他对任意的还原者处理相同的行为,并且通常不同意“鸭子”的方法。显然只有一个观点,你应该完全自由地去做任何对你自己的应用最有效的事情,但是要考虑的事情。
最终,我认为答案是你试图使用“模块化”的方法,但发现所需的行为实际上并不是“模块化”的。

这是有道理的,谢谢。我也发现了这一点,解释了丹·阿布拉莫夫的观点,这可能对任何遇到我问题的人都有帮助: