【发布时间】: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