ImmutableJS深度设置一个对象

时间:2017-01-09 21:59:23

标签: reactjs react-redux immutable.js

我正在尝试使用.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']));;

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

2 个答案:

答案 0 :(得分:0)

您不能将setfromJS创建的嵌套结构一起使用。

您需要使用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>
&#13;
&#13;
&#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

JS Filddle