看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');
});
还有另一种方式,或者我在滥用记录?
答案 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});