2017-03-13 16 views
1

私は反応する/還元するのが新しいです。私は(Map/Set ...のようなimmutablejsオブジェクトを格納する)reduxストアのコンテナパターンを使用しています。私はreduxコンテナに不変のシーケンスアルゴリズムを行う必要がありますか?

私が知っているように、Reactコンポーネントには、propsのシャドウ比較のためのshouldComponentUpdateというメソッドがあります。不変はこの計算に多く役立ちます。だから私の質問は、私は以下のようにreduxコンテナのシーケンスアルゴリズムを行う必要がありますか?

export default connect(
    (state) => ({ 
     data: state.getIn(['data', 'map']) 
     .filter((obj, key) => state.getIn(['user', 'selectedDataSet']).has(key)) 
     .toSet(), 
    }), 
)(MyComponent); 

または、このロジックをcomponentWillReceiveProps()に入れる方が良いですか?

答えて

1

mapStateToPropsFunction(わからない人のための最初の接続パラメータ)にこの機能を保存する必要があります。私はできるだけ限定された小道具を私のコンポーネントに渡しておきたい。つまり、コンポーネントまたはその子に必要とされる小道具のみを送信します。このようにして、コンポーネントは余分な小道具を扱う方法や特別なロジックを持つ方法を知る必要はありません。

mapStateToPropsのロジックを維持するもう1つの利点は、コンポーネントがPureComponent(class MyComponent extends React.PureComponent)を拡張して、浅い小道具検査を使用して無料のshouldComponentUpdateを取得できることです。

これは、子コンポーネントにこれを残しておきたい理由があると確信しています。

編集:ImmutableJS

では不変JSと非常によくペアを反応します。 ===でも、深くネストされたオブジェクトが変更されたかどうかを判断するために、比較が必要です(すべての変更によって全く新しいオブジェクトが作成されるというルールがこれを可能にします)。

反応コンポーネントがレンダリングするために必要なものすべてを渡す必要があります。たとえば、コンポーネントがリストに依存する場合は、リスト全体をコンポーネントに渡してからレンダリングする前にフィルタリングします。あなたの例では

render() { 
    const data = dataProp 
     .filter((obj, key) => state.getIn(['user', 'selectedDataSet']).has(key)) 
     .toSet() 

    return (
     <div>{data}</div> 
    ); 
} 

これは、あなたの接続は、この(これは100%正しい構文ではないかもしれないことに注意してください)のようになります前提としています。

export default connect(
    (state) => ({ 
     dataProp: state.getIn(['data', 'map']) 
    }), 
)(MyComponent); 
+0

私が以前に試したように、map/filterのような関数が同じオブジェクトを使用する代わりに新しいオブジェクトを生成することがわかりました。下記を参照してください。 '' 'const list = Immutable.List([1,2,3]);' ''これをチェックすると、以下のようにtrueの代わりにfalseが表示されます。 '' 'list.map(data => data * 2)=== list.map(data => data * 2)' 'これは、shouldComponentUpdateが更新決定を下すようにします。 –

+0

これはまさしくImmutableをとても素晴らしいものにしています!オブジェクト内で変更されたデータは全く新しいオブジェクトを作成します。このように、オブジェクトの深いレベルで変更が発生した場合でも、単純な比較( '===')を使用して、コンポーネントを更新する必要があるかどうかを確認できます。私の投稿に簡単なアップデートを加えてみましょう。 –

+1

私は、shouldComponentUpdateで自由な影を比較するために、コンテナから不変の保持リストをコンポーネントに渡すことを考えます。 –

関連する問題