Reactjs Immutable JS-如何用新列表替换列表
我有一个React+Redux应用程序,它使用Immutability.js。在我的reducer中,我将state定义为一个不可变列表Reactjs Immutable JS-如何用新列表替换列表,reactjs,redux,immutable.js,Reactjs,Redux,Immutable.js,我有一个React+Redux应用程序,它使用Immutability.js。在我的reducer中,我将state定义为一个不可变列表 const initialSuggestedResponseState=Immutable.List([]) 每次发生特定操作时,我都想用新列表替换此列表。我想我在Immutability.js中遗漏了一些东西,因为我还没有找到一个有效的解决方案。到目前为止,我已经尝试过这样的事情: state.clear(); action.
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;
然而,这并没有将任何内容推到我的列表中。为什么这不起作用,合适的方法是什么?我相信有更简单的方法
提前感谢:)执行状态。推送任何类型的不可变对象都会返回一个新对象。现有状态未被修改,这就是为什么在推送到状态后返回状态不起作用的原因。一个快速的破解方法是改变state.push(newResponse)
tostate=state.push(newResponse)代码>。我建议您阅读更多关于不可变结构如何工作的内容:)作为zackify回答的后续内容,以下是简化代码的一种方法:
return new List(action.messages.map(message => {
return new suggestedResponseRecord({
body: message.body,
responseId: message.response_id,
type: message.type
});
});
这将从消息数组中创建一个记录数组(使用),然后将该新数组转换为不可变列表。不确定这是否是最有效的做事方式,但它可读性很强。Ah!是的,这很有道理。谢谢:)这违背了不变性的目的。这就是为什么我说这是一个快速的黑客使它工作。不管怎样,它不应该被接受是我的观点。我已经写了一个保持不可变的答案。我的答案以最小的代码更改量解决了问题,并让提出问题的人去调查他应该如何正确使用不可变的代码。