这是我的州的样子:
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);
}
我很确定有更好的方法可以做到这一点。无论我的状态参数是否为不可变,它都应该起作用。任何的想法?谢谢!
答案 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/update。 updateIn
对于更新商店状态也非常有用,set
,merge
,setIn
和mergeIn
也是如此。