2017-01-09 102 views
0

我正在嘗試使用.set()來設置不可變對象的值。值應該更新,但我無法使用.getIn()之後的對象獲取。我認爲這是因爲它不會將對象的孩子設置爲不可變的。在immutable.js中有沒有任何方法可以讓我做到這一點?我知道我可以像.set(fromJS('rooms', roomMap))一樣包裝fromJS()中的對象,但這看起來很混亂。什麼是正確的方法來做到這一點?ImmutableJS深層設置對象

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']));; 

https://jsfiddle.net/z0a4p199/1/

+1

那就是'fromJS'功能是什麼,但。要麼你用各自的'Map'或'List'函數建立每個嵌套集合,但這看起來不合理。 – stinodes

回答

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 

JS Filddle

0

你不能與fromJS創建嵌套結構使用set。您需要使用mergeDeepupdateIn。在你的情況,你將不得不使用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>