Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs Immutable JS-如何用新列表替换列表_Reactjs_Redux_Immutable.js - Fatal编程技术网

Reactjs Immutable JS-如何用新列表替换列表

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.

我有一个React+Redux应用程序,它使用Immutability.js。在我的reducer中,我将state定义为一个不可变列表

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)
to
state=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!是的,这很有道理。谢谢:)这违背了不变性的目的。这就是为什么我说这是一个快速的黑客使它工作。不管怎样,它不应该被接受是我的观点。我已经写了一个保持不可变的答案。我的答案以最小的代码更改量解决了问题,并让提出问题的人去调查他应该如何正确使用不可变的代码。