【问题标题】:Real-world consequences of misusing Redux reducers?滥用 Redux reducer 的现实后果?
【发布时间】:2016-12-15 14:46:26
【问题描述】:

我继承了一个 Redux 代码库,我发现了一些违反 Redux 基本规则的代码:reducers 中没有副作用。

具体来说,有一个tracking reducer,它看起来像这样:

function tracking(state = {}, action) {
  function sendEvent(event, data) {
    // API call here to send a tracking event
  }

  switch (action.type) {
    case TRACK_FRIEND_REQUEST:
      sendEvent('track-friend-request', action.payload);
      return state;

    case TRACK_LINK_CLICK:
      sendEvent('link-click', action.payload);
      return state;
  }
}

这显然是错误的;状态是没有意义的,它的存在只是为了它的副作用。正确的解决方案 (IMO) 是创建一个 tracking 中间件,该中间件使用 meta 属性侦听操作,并将 meta 属性附加到 实际 事件,而不是创建这些专门的轨道事件。

但令人惊讶的是,我找不到以这种方式使用它的任何实际后果,而且我很难证明为什么值得努力修复它(有很多这样的跟踪事件,所以它将是相当多的工作)。

我看到的唯一潜在问题是,在使用开发工具时,只要您切换操作,事件就会重新发送。不过,我们已经忽略了开发模式下的跟踪操作,所以这不是问题。

还有其他原因会导致此代码导致我不知道的实际问题吗?

【问题讨论】:

  • 我能想象的唯一问题是,如果新开发人员跳入此代码库,他们可能会根据您的 api 调用的响应实现一些状态更改功能。正如您所指出的,这只是对 redux 的滥用。中间件将是要走的路。
  • 同意,我想我会添加一些“谴责”这个减速器的 cmets 来防止这种情况。谢谢!

标签: javascript redux


【解决方案1】:

是的,你死定了。主要问题是在使用 Redux DevTools 时进行调试。在先前派发的动作之间来回切换会导致这些动作再次通过减速器派发,从而重新触发此行为。

是的,这类事情的“正确”位置是中间件。

【讨论】:

  • 我真的很惊讶听到没有更重要的后果!这是一种代码味道,但我想这是少数几个只会产生学术问题的情况之一。谢谢你的回答。
  • 是的。在技​​术层面上,Redux 只是调用你的根 reducer 并存储结果。对“纯函数”的关注是 DevTools / 时间旅行调试的组合,确保 React-Redux 适当更新、可测试性和函数式编程概念的一般有用性。
猜你喜欢
  • 1970-01-01
  • 2019-05-07
  • 2013-10-22
  • 2018-09-18
  • 2016-09-08
  • 2018-05-29
  • 2023-03-06
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多