2016-12-15 7 views
3

私はReduxコードベースを継承しました。Reduxの基本ルールに違反するコードの一部が見つかりました。Reduxレデューサーの誤用による現実的な影響?

具体的には、そこ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)は、metaプロパティでアクションをリッスンするtrackingミドルウェアを作成し、これらの特殊なトラックイベントを作成する代わりに、実際のイベントにmetaプロパティを割り当てます。

驚いたことに、私はこのように使用しても実際の結果は見つからず、なぜそれを修正する努力が必要なのか正当化するのは苦労しています(これらの多くの追跡イベントがありますそれは仕事のかなりのビットです)。

私が見る唯一の潜在的な問題は、devtoolsを使用すると、アクションをトグルするたびにイベントが再送信されることです。ただし、devモードでのトラッキングアクションは既に無視されているため、これは問題ではありません。

このコードが私が気づいていない現実世界の問題を引き起こす他の理由はありますか?

+0

私が想像できる唯一の問題は、新しい開発者がこのコードベースに飛び乗ると、APIコールの応答に応じていくつかの状態変更機能を実装できることです。あなたが指摘したように、これは単なる還元の悪用です。ミドルウェアは道のりです。 –

+0

合意して、私は、これを守るためにこの減速機を「非難する」というコメントを追加するつもりだと思う。ありがとう! –

答えて

2

あなたは死んでいます。主な問題は、Redux DevToolsの使用中にデバッグすることです。以前にディスパッチされたアクション間を前後に反転すると、それらのアクションがリデューサーを介して再びディスパッチされ、この動作が再トリガーされます。

はい、この種の「正しい」場所はミドルウェアです。

+1

私は実際にはそれ以上の重要な影響がないことを聞いて驚いています!それはそのようなコードのにおいですが、これは_academic_の問題のみを生成する数少ないケースの1つであると思います。ご回答有難うございます。 –

+0

うん。技術レベルでは、Reduxはルート・レデューサーを呼び出して結果を保管します。 「純粋な関数」に焦点を当てるのは、DevTools /タイムトラベルのデバッグ、React-Reduxの適切な更新、テスト容易化、Functional Programmingの概念の一般的な有用性の組み合わせです。 – markerikson

関連する問題