2016-07-20 7 views
0

私はReact、Redux、Immutableで遊んでいて、本当に嫌なことに出くわしました。私は大きなJSONデータセットをサーバーから返してきました。これはfromJSヘルパーを使用して不変に解析しています。Immutable.js - fromJSは地図の代わりにレコードを生成します

しかし、私のコンポーネントのプロパティにアクセスする場合は、不変の特定のゲッターとセッターを使用する必要があります。私の問題は不変に縛られている、私はこれを変更することを決めた行に沿って、私はそれぞれのコンポーネントを通過し、それに応じて調整する必要があります。

私の質問には、現在fromJSがリストとマップを返すので、マップをレコードに置き換えることは可能ですか?

これは、コンポーネントを不変から切り離し、ネイティブプロパティを持つことになります(user.get('name')ではなくuser.name)。

私はリバイバーについて少しは読んだことがありますが、同様のユースケースを見つけることはできません。

私は次のようでプレーをしましたが、それは最善の解決策だ場合、私はわからないよ:ImmutableJSを使用してもする能力を持つことに興味を持っている誰のために

var result = Immutable.fromJS({ 

    id: 2039428947, 
    name: 'James', 
    email: '[email protected]', 
    country: 'United Kingdom' 

}, function(key, value) { 

    var obj = Immutable.Record(value.toJS()); 

    return new obj(value); 

}); 

おかげ

+0

不変を使用する必要はありません。あなたに適した[代替](https://github.com/rtfeldman/seamless-immutable)があります。また、あなたの状態から新しいネイティブオブジェクトを作成することもできます。 – robertklep

答えて

3

コンポーネントでのネイティブプロパティを使用して、代わりにuser.get('name')の例えばuser.nameは、単にfromJSの代わりに以下の機能を使用します。

function convertJs(js) { 

    if(typeof js !== 'object' || js === null) { 

     return js; 

    } 

    if(Array.isArray(js)) { 

     return Seq(js).map(convertJs).toList(); 

    } 

    let obj = Record(js); 

    obj = new obj(Seq(js).map(convertJs)); 

    return obj; 

} 

プロパティの競合を覚えておきたいことは、関数に渡すオブジェクトにImmutableJsで使用されるプロパティ名が含まれていないことを確認してください。サイズが良い例です。競合が発生した場合は、次のメッセージが表示されます。

Uncaught Error: Cannot set on an immutable record

+0

私はいつ、なぜユーザーが「レコード」を使用するのかを理解していません。これについて詳しく説明するリソースはありますか? –

+0

ドキュメントごと:https://facebook.github.io/immutable-js/docs/#/Record **レコード**は通常のjsオブジェクトとして機能し、同じ方法でプロパティにアクセスできます。たとえば、user .getメソッドを使用する** Map **とは対照的に.name(例:user.get( 'name');また、設定された数のプロパティを強制することができ、内容がはっきりと表示されるので、組み込みのドキュメントとして機能することができます。対照的な地図は厳密には強制されない任意の数のプロパティを持つことができます。 – jhdevuk

+0

プロパティの名前のコメントは非常に良かった、私を助けた!私にとってはプロパティエラーが既に使用されていたので、名前を変更する必要がありました –

関連する問題