我想在我的不可变对象树中的某个地方添加一个元素。
这个问题似乎已在这里得到解答:
但由于某种原因,它对我不起作用。
如果我有以下代码:
var myState = {
a: {
b: {
c: [
{name: 'hi', value: 2},
{name: 'howdy', value: 3}
]
}
}
}
myState = Immutable.fromJS(myState);
myState = myState.update(['a', 'b', 'c'], function (myList) {
myList.push({"name": "hallo", "value": 4})
}
);
我收到错误:
未捕获的TypeError:无法读取属性' push'未定义的
表示传递给回调的myList参数为null。
为什么会这样?
小提琴:
答案 0 :(得分:1)
这是应该写的:
@BeforeEach
以下是一个工作示例:
myState.updateIn(['a', 'b', 'c'], function (myList) {
return myList.push({"name": "hallo", "value": 4})
}
);
var myState = Immutable.fromJS({
a: {
b: {
c: [{
name: 'hi',
value: 2
},
{
name: 'howdy',
value: 3
}
]
}
}
})
myState = myState.updateIn(['a', 'b', 'c'], function(myList) {
return myList.push({
"name": "hallo",
"value": 4
})
});
console.info('myState = ' + myState.toJS())
请注意我使用<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>
代替updateIn
并返回update
的结果
答案 1 :(得分:-1)
经过多次填充,我能想到的唯一解决方案是获取数组,转换为JS,将元素推送到它上面,然后将其转换回不可变的...然后使用 setIn ,不是 updateIn ,而不是更新。
var myState = {
a: {
b: {
c: [
{name: 'hi', value: 2},
{name: 'howdy', value: 3}
]
}
}
}
myState = Immutable.fromJS(myState);
var list = myState.getIn(['a', 'b', 'c'])
var list = list.toJS();
list.push({"name": "hallo", "value": 4});
var v = Immutable.fromJS(list)
myState = myState.setIn(['a', 'b', 'c'], v)
这看起来像一个可怕的解决方案,但它是迄今为止唯一对我有用的东西。
通常需要大约5分钟的时间来学习如何在框架或语言中将元素添加到列表中。
我不希望它花费5 HOURS 。
此框架的文档绝对是一种耻辱。