将元素添加到Map内的List(ImmutableJS)

时间:2016-01-20 20:52:55

标签: list dictionary reactjs redux immutable.js

这是我的州的样子:

  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);
 }

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

1 个答案:

答案 0 :(得分:3)

这是一种可能的实施方式:

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

如果密钥不存在,则传递给update的第二个arg是默认值,第三个参数是一个闭包,用于获取密钥的当前值(或默认值)并执行必要的更新。该代码还会将邮件转换为Immutable.Map,但您可能更喜欢使用Immutable.Record类型。

有关update的更多信息,请参阅https://facebook.github.io/immutable-js/docs/#/Map/updateupdateIn对于更新商店状态也非常有用,setmergesetInmergeIn也是如此。