web-dev-qa-db-ja.com

Immutable.jsレコードで複数のフィールドを一度に設定する方法は?

this を見ると、不変だと思います。 Recordは「javascript不変オブジェクト」を表すためのデータ構造ですが、毎回setを呼び出す複数のオブジェクトを作成せずに、一度に複数のフィールドを更新したいです。

このようなことをしたい

class LoginContext extends Immutable.Record(
{ logged : false, loading: false, error: false, user: null}){
}

var loginContext = new LoginContext()

var anotherContext = loginContext.set({'logged':'true', 'error':'false'})

I 読み取り APIの一貫性のためにオブジェクトをRecord.set()に渡すことはできません:

このライブラリとES6の両方でのセットの他の使用法との一貫性。 MapおよびSetのセットはオブジェクトを受け入れることができません。これらのキーは文字列だけでなく、何でもかまいません。レコードには文字列が必要ですが、APIの一貫性を保つことが重要です。

そして、私は使用できることを知っています:

var anotherContext = loginContext.withMutations(function (record) {  
  record.set('logged','true').set('error','true'); 
});

別の方法がありますか、またはレコードを誤用していますか?

53
gabrielgiussi

個人的に私はマージ構文を好む、それはより自然に感じます:

const newContent = oldContext.merge({
    "logged": true, 
    "error": false
});

非常に複雑なことをしている場合は、一時的なバージョンの方が良いかもしれませんが、どこにあるか想像できません。

また、必要に応じてmergeDeepを活用できることも意味します。

48
Chris

元の質問に答えるには、.withMutations()を使用します

ここからドキュメントからの抜粋:

突然変異を適用して新しい不変オブジェクトを作成すると、オーバーヘッドが発生し、パフォーマンスがわずかに低下する可能性があります。戻る前に一連の突然変異をローカルに適用する必要がある場合、Immutableを使用すると、コレクションの一時的な可変(一時)コピーを作成し、withMutationsを使用してパフォーマンスの高い方法で突然変異のバッチを適用できます。実際、これはImmutableが複雑な突然変異自体を適用する方法とまったく同じです。

したがって、次のように何かを書くことができます。

loginContext.withMutations((ctx) => {
    ctx.set('logged', true).set('error', false)
});

それに加えて、Recordsは通常のjsドット表記でも使用できると考えました。

幸運を!

24
RemEmber

複数のセットを連鎖させてみませんか?そのようです:

ImmutableObj.set('key', 'value')
.set('key2', 'value2')
.set('key3', 'value3'); 
14
James111

いくつかのことを異なる方法で行う必要があります。まず、Immutable.Recordを拡張せず、コンストラクターを使用します。

var LoginContext = Immutable.Record({
  logged:false,
  loading:false,
  user: null  
}, 'LoginContext');

これは、オブジェクトでインスタンス化できるクラスを返します。

var anotherContext = new LoginContext({logged:true, error:false});
1
MattW.