将元素添加到地图内的列表(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/update。 updateIn
对于更新存储状态也非常有用,set
、merge
、setIn
和 mergeIn
.
也是如此
这是我的状态示例:
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/update。 updateIn
对于更新存储状态也非常有用,set
、merge
、setIn
和 mergeIn
.