不可变JS - 如何用新列表替换列表

时间:2016-11-21 16:54:07

标签: reactjs redux immutable.js

我有一个使用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;

然而,这并没有将任何推送到我的列表中。为什么这不起作用,适当的方法是什么?我确信有一些更简单的东西。

提前致谢:)

2 个答案:

答案 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),然后将该新数组转换为不可变列表。不确定这是否是最有效的做事方式,但它具有很强的可读性。