我继承了Redux代码库,我发现了一些违反Redux基本规则的代码:在reducers中没有副作用。
具体来说,有一个tracking
减速器,它看起来像这样:
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
属性附加到实际事件,而不是创建这些专门的赛道事件。
但令人惊讶的是,我无法通过这种方式找到使用它的任何实际后果,而且我很难证明为什么值得努力修复它(有一个很多这些跟踪事件,所以这将是一项相当多的工作。)
我看到的唯一潜在问题是,在使用devtools时,只要您切换操作,就会重新发送事件。我们已经忽略了开发模式下的跟踪操作,所以这不是一个问题。
还有其他原因导致此代码会导致我不知道的实际问题吗?
答案 0 :(得分:2)
是的,"正确"这种事情的地方将是一个中间件。