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');
});
別の方法がありますか、またはレコードを誤用していますか?
個人的に私はマージ構文を好む、それはより自然に感じます:
const newContent = oldContext.merge({
"logged": true,
"error": false
});
非常に複雑なことをしている場合は、一時的なバージョンの方が良いかもしれませんが、どこにあるか想像できません。
また、必要に応じてmergeDeep
を活用できることも意味します。
元の質問に答えるには、.withMutations()
を使用します
ここからドキュメントからの抜粋:
突然変異を適用して新しい不変オブジェクトを作成すると、オーバーヘッドが発生し、パフォーマンスがわずかに低下する可能性があります。戻る前に一連の突然変異をローカルに適用する必要がある場合、Immutableを使用すると、コレクションの一時的な可変(一時)コピーを作成し、withMutationsを使用してパフォーマンスの高い方法で突然変異のバッチを適用できます。実際、これはImmutableが複雑な突然変異自体を適用する方法とまったく同じです。
したがって、次のように何かを書くことができます。
loginContext.withMutations((ctx) => {
ctx.set('logged', true).set('error', false)
});
それに加えて、Recordsは通常のjsドット表記でも使用できると考えました。
幸運を!
複数のセットを連鎖させてみませんか?そのようです:
ImmutableObj.set('key', 'value')
.set('key2', 'value2')
.set('key3', 'value3');
いくつかのことを異なる方法で行う必要があります。まず、Immutable.Recordを拡張せず、コンストラクターを使用します。
var LoginContext = Immutable.Record({
logged:false,
loading:false,
user: null
}, 'LoginContext');
これは、オブジェクトでインスタンス化できるクラスを返します。
var anotherContext = new LoginContext({logged:true, error:false});