将元素添加到地图内的列表(ImmutableJS)

Add element to List that is inside a Map (ImmutableJS)

这是我的状态示例:

  state = {
    messages: [
       {name: 'Bruce', content: 'Hello'},
       {name: 'Clark', content: 'World'}
    ]
  }

我正在编写一个 reducer,它将执行 ADD_MESSAGE 操作并将一条消息添加到消息列表中。我想考虑未定义 'messages' 键的情况。我刚开始使用 ImmutableJS。

这是我编写函数的方式:

 // This is really bad
 const addMessage = (state, message) => {
    let mutableState = state.toJS();
    if(mutableState.messages){
      mutableState.messages.push(message);
    }else{
      mutableState = {messages: [message]}
    }

    return fromJS(mutableState);
 }

我很确定有更好的方法来做到这一点。无论我的状态参数是否不可变,它都应该起作用。任何的想法?谢谢!

这是一个可能的实现:

const addMessage = (state, message) => 
    state.update('messages', Immutable.List(), 
        msgs => msgs.push(Immutable.Map(message)));

如果键不存在,传递给update的第二个参数是默认值,第三个参数是一个闭包,用于获取键的当前值(或默认值)并执行需要更新。该代码还将消息转换为 Immutable.Map,但您可能更愿意使用 Immutable.Record 类型。

有关 update 的详细信息,请参阅 https://facebook.github.io/immutable-js/docs/#/Map/updateupdateIn 对于更新存储状态也非常有用,setmergesetInmergeIn.

也是如此