如何在Immutable.js Record中一次设置多个字段?

时间:2015-07-27 23:23:57

标签: 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'})

read您无法将对象传递给Record.set()以获取API 一致性:

  

与此库中的set的其他用法保持一致   在ES6中。 Map和Set的集合不能接受一个对象,因为它们   键可以是任何东西,而不仅仅是字符串。记录必须有字符串,但是   保持API一致非常重要。

我知道我可以使用:

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

还有另一种方式,或者我在滥用记录?

4 个答案:

答案 0 :(得分:45)

我个人更喜欢合并语法,感觉更自然:

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

如果你做的事情非常复杂,也许瞬态版会更好,但我无法想象在哪里。

这也意味着您可以根据需要使用mergeDeep

答案 1 :(得分:23)

要回答原始问题,我们将使用.withMutations()

这里摘录自文档:

  

应用变异来创建新的不可变对象会导致一些开销,这可能会导致轻微的性能损失。如果您需要在返回之前在本地应用一系列突变,则Immutable使您能够创建集合的临时可变(瞬态)副本,并使用withMutations以高效方式应用一批突变。事实上,这正是Immutable本身如何应用复杂突变。

所以你可以写一些东西:

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

除此之外,我认为Records也可以与普通的js点符号一起使用。

祝你好运!

答案 2 :(得分:14)

为什么不直接连结多套?像这样:

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

答案 3 :(得分:1)

你应该做一些不同的事情。首先,不要扩展Immutable.Record但使用构造函数:

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

这将返回一个可以使用对象实例化的类:

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