2017-02-21 5 views
2

これは正しいことではありません。reduxを使用しているときにimmutable.jsを使用するとは何ですか?

reduxを使用している間は、レデューサーではスプレッド演算子を使用します。

{...state,data : action.payload,fetching:false}

新しい状態オブジェクトが作成されていることを、むしろ右の正しい状態を変異よりも? (私が間違っている場合は私を訂正してください)

このような場合、immutableJSの使用は何ですか? これは、上記と同様の動作を行います。

答えて

2

正しいですが、表示されている例では、新しいオブジェクトを作成して状態を変更しないという例です。多くの場合は問題ありません。したがって、あなたがImmutableJSがあなたのために何かを追加しようとしていると感じなければ、それを使用しないでください。

拡散演算子がES6で一般的に使用される前に、ImmutableJSがより便利でした(これは技術的にはstill only a proposalだと思います)。 ES6を使用していない場合は、Object.assignを使用することもできます。これは非常に厄介で、非常に迅速に、特により多くのネストされた構造を使用することができます。

ImmutableJSは、状態ツリー内の深い単一のノードを変更する必要がある場合にも有効ですが、この場合は、通常は別の方法でデータを構造化することで回避できます。

+0

しかし、それを使うことにはさまざまな利点があります。あなたが正規化されたデータ構造を持っていれば、それほど面倒ではないと言います。その時点で、Immutableは深いツリーを持たないため、簡単なAPIの利点のいくつかを失って深い変更を行います。しかし、それ以外にも、私はまだあなたがデータ変更のすべてで不変であることをImmutableが信じており、便利なAPIを使っている間に他の開発者もそうでなければならないことを保証します。私は個人的にそれをお勧めします – JonE

+0

ええ、それは素晴らしい点です。私はそれが理にかなっているときだけライブラリを使用することを大いに信じています。したがって、コードベースが共有されていれば、私の意見では、不変性の適用はそれを使用する合理的な理由になります。 –

+0

"その時点でImmutableは深いツリーを持たないため、簡単なAPIの利点を失って深い変更を加えることができます。" @ Glitch100それを詳しく教えてもらえますか? –

0

状態を不変にすると、状態がフラックスフローの外側で変更されないようになります。多くのレベルと小道具を渡している非常に複雑な構造では、それが誤って突然変異するのを防ぎます。

1

シンプルなフラット状態の場合、余分なライブラリを使用せずに簡単に管理できます。

しかし、あなたには、いくつかのユーザーの名前を更新する場合、それは

return { 
    ...state, 
    users: { 
    ...state.users, 
    [action.userId]: { 
     ...state.users[action.userId], 
     name: action.newName 
    } 
    } 

そう簡単ではありませんかなり多くのコード、ISNになり、次の

{ 
    users: { 
    123: { 
     name: 'John', 
     lastName: 'Doe' 
    }, 
    345: { 
     name: 'Bob', 
     lastName: 'Jack' 
    } 
    .... 
    } 
} 

のように、のは、より複雑な何かを考えてみましょうそれ?現時点では、別の解決策を探したいかもしれません。

state.setIn(['users', action.userId, 'name'], action.newName) 
関連する問題