【问题标题】:Add element to List that is inside a Map (ImmutableJS)将元素添加到 Map 内的 List (ImmutableJS)
【发布时间】:2016-04-26 21:41:37
【问题描述】:

这是我的状态的示例:

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

我正在编写一个reducer,它将执行ADD_MESSAGE 操作并将一条消息添加到消息列表中。我想考虑未定义“消息”键的情况。我刚刚开始使用 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);
 }

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

【问题讨论】:

    标签: list dictionary reactjs redux immutable.js


    【解决方案1】:

    这是一个可能的实现:

    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 也是如此。

    【讨论】:

    • 非常感谢! Immutable.Record 正是我想要的,使用地图似乎是错误的!
    猜你喜欢
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    相关资源
    最近更新 更多