2016-07-23 8 views
9

私は、別の減速機からの情報を必要とする減速機を持っていることがあると思います。それ以外の場合は私が正しくインデックスを決定することができないので、私は、関数の2行目でstore.getStateを呼び出して行うRedux:reduce.getState()をリデューサ関数で呼び出すと、それは反パターンですか?

import * as ActionTypes from '../actions/action_type_constants'; 
import KeyCode from 'keycode.js/index'; 
import {store} from "../index"; 
import {mod} from "../pure_functions"; 

export function selectedCompletion(state = 0, action) { 
    if (action.type === ActionTypes.arrowKeyPressed) { 
    const completionsLength = store.getState().completions.data.length; 
    if (action.keyCode === KeyCode.UP) { 
     return mod(state - 1, completionsLength); 
    } else if (action.keyCode === KeyCode.DOWN) { 
     return mod(state + 1, completionsLength); 
    } 
    } 
    return state; 
} 

:たとえば、私は、この減速機を持っています。

私はおそらくこれともう一つの還元剤をリファクタリングすることができますので、一つの大きな還元剤になりますが、読みやすさのために私はこのオプションを好むでしょう。

このパターンのstore.getState()をレデューサーで呼び出すと、何らかの問題が発生するかどうかはわかりません。

答えて

12

はい、これはです。完全にのパターンです。減速機機能は、純粋なものでなければならず、直接入力(現在の状態と動作)のみに基づいている必要があります。

Redux FAQでは、この種の問題について、http://redux.js.org/docs/FAQ.html#reducers-share-stateについて説明しています。基本的には、必要な追加情報を渡すカスタムレデューサーロジックを作成するか、詳細な情報を入力する必要があります。

私はまた、Reduceドキュメントに関するセクションを書きましたStructuring Reducers、これは、減算ロジックに関連するいくつかの重要な概念について説明しています。私はそれを読むことをお勧めします。

+0

私はここで少し混乱しています。getStateは現在の状態に基づいて違反を呼びますか?特に、再配置できないサードパーティ製の減速機の使用例があります。 –

+1

最初に、「純粋な関数」の定義は、「その入力にのみ依存し、それ自体の外には何も変更または影響を与えない関数」です。インポートされたストアを参照すると、純粋ではありません。第2に、これは特定の店舗インスタンスにレデューサーを結びつけます。つまり、テストや複数の店舗のようなケースでは機能しません。したがって、ほとんどの場合、コード_may_は機能しますが、間違いなく「正しい」ことはありません。物事を扱う方法については、FAQ項目と[Structuring Reducers](http://redux.js.org/docs/recipes/StructuringReducers.html)をもう一度お読みください。 – markerikson

関連する問題