2016-11-22 13 views
4

私のmapStateToPropsは複雑さが増しています。ビューロジックをreduxで処理する

例えば、複数の接続コンポーネントに、私はこのような何かやっている:

const mapStateToProps = (state) => { 
    return { 
    activeAsset: state.assets.byId[state.assets.activeAssetId].attributes 
    } 
} 

を問題#1: 上記のコードはactiveAssetId以来、いくつかの条件文でガードできることはかなり明白です必ずしも上記のエラーを投げることにつながる設定されていません。

問題#2: 私は今、上記のコードを複製する必要があり、複数のコンポーネントの現在のactiveAssetを取得したいとします。

私はreselectについて聞いたことがありますが、ここで正しい選択であるかどうかは完全にはわかりませんが、これはメモ付きの関数で特に使用されているようです。

答えがかなり明白な場合は、私はreduxの生態系にかなり新しいです。

+0

こちらをご覧くださいhttp://stackoverflow.com/questions/40711359/changing-the-layout-of-a-component-depending-on-redux-state/40711713#40711713ビジネスロジックをビューから分離することについて説明しています。また、メモ型で保守可能なコードのセレクタの使用についても説明しています。 –

答えて

4

安全な解決策は、セレクタを使用することです。セレクタは、ストア内の状態の形状を把握し、派生データを生成できる再利用可能な関数です。あなたのケースでは

、これはあなたの選択になります

const getAssetAttributes = ({ assets }) => (assets.byId[state.assets.activeAssetId] && assets.byId[state.assets.activeAssetId].attributes) || null; // if the asset exists and has attributes return it, if not return null 

使用法:

const mapStateToProps = (state) => { 
    return { 
    activeAsset: getAssetAttributes(state) 
    } 
} 

あなたはすべての派生したデータ用のセレクタを作成し、関連する減速機のファイルに保存する、またはにすることができます別ファイルselectorsReselectは、メモり標準セレクタの作成に役立ちますが、必須ではありません。パラメータが変更されていない場合、セレクタを再選択すると同じデータが返され、不必要にコンポーネントを再レンダリングできなくなります。

関連する問題