我正在尝试使用.set()
设置不可变对象的值。值应该更新,但之后我无法使用.getIn()
从对象中获取。我认为这是因为它没有将对象的子项设置为不可变的深层次。在immutable.js中是否有任何方法可以让我这样做?我知道我可以将fromJS()
中的对象包裹起来.set(fromJS('rooms', roomMap))
,但这看起来很混乱。这样做的正确方法是什么?
const state = Immutable.fromJS({
rooms: false
});
const roomMap =
{
"roomid1": {
"id": "roomid1",
"name": "Room 101",
},
"roomid2": {
"id": "roomid2",
"name": "Room 102",
},
};
var newState = state.set('rooms', roomMap);
console.log(newState.getIn(['rooms', 'roomid1']));;
答案 0 :(得分:0)
您不能将set
与fromJS
创建的嵌套结构一起使用。
您需要使用mergeDeep
或updateIn
。在您的情况下,您必须使用mergeDeep
const state = Immutable.fromJS({
rooms: false
});
console.log(state.get('rooms'));
const roomMap = {
"roomid1": {
"id": "roomid1",
"name": "Room 101",
},
"roomid2": {
"id": "roomid2",
"name": "Room 102",
},
};
const newState = state.mergeDeep({
rooms: roomMap
});
console.log(newState.get('rooms'));

<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>
&#13;
答案 1 :(得分:0)
您的房间地图是一个普通的javascript对象,而不是immutalblejs地图。
因此,当您执行state.set('rooms', roomMap)
时,您将房间的值设置为普通的javascript对象。
newState.getIn(['rooms', 'roomid1'])
:仅当newState完全是javascript对象时才有效。
你必须将roomMap转换为immutablejs地图或以普通的javascript方式访问roomid1。
备选方案1:
roomMap = Immutable.fromJS(roomMap)
state.update('rooms', (oldvalue)=>(roomMap))
newState.getIn(['rooms', 'roomid1'])
备选方案2:
newState.get('rooms').roomid1