我有一个使用Immutability.js的React + Redux应用程序。在我的reducer中,我将状态定义为不可变列表
const initialSuggestedResponseState = Immutable.List([]);
每次发生特定操作时,我都想用新列表替换此列表。我想我错过了Immutability.js的一些东西,因为我还没有找到一个有效的解决方案。到目前为止,我尝试过这样的事情:
state.clear();
action.messages.forEach(message => {
let newResponse = new suggestedResponseRecord({
body: message.body,
responseId: message.response_id,
type: message.type
});
state.push(newResponse);
});
return state;
然而,这并没有将任何推送到我的列表中。为什么这不起作用,适当的方法是什么?我确信有一些更简单的东西。
提前致谢:)
答案 0 :(得分:3)
对任何类型的不可变对象执行state.push都会返回一个新对象。现有的状态没有被修改,这就是为什么在推送之后返回状态不起作用的原因。快速破解就是将state.push(newResponse);
更改为state = state.push(newResponse);
。我建议你阅读更多有关不可变结构如何工作的内容:)
答案 1 :(得分:1)
作为zackify回答的后续内容,您可以采用以下方法来简化代码:
return new List(action.messages.map(message => {
return new suggestedResponseRecord({
body: message.body,
responseId: message.response_id,
type: message.type
});
});
这将从您的消息数组中创建一个记录数组(使用Array.prototype.map
),然后将该新数组转换为不可变列表。不确定这是否是最有效的做事方式,但它具有很强的可读性。