immutablejs(react / redux),“推”到具有不可变

时间:2015-11-19 20:23:02

标签: javascript reactjs redux immutable.js

在我的react / redux应用程序中,我使用类似这样的东西在reducers中设置状态:

 state.set('search', myResults);

状态是不可变的Map()。运行toJS()时对象的格式(不再是不可变对象)就像这样:

 {
    results: { ..all results in here }
 }

所以你有state.search.results

这很好用,但我有一个场景,我需要“推”到这张地图的搜索部分。我认为合并将照顾这一点,但它似乎没有像我想象的那样工作。我试过了:

  state.mergeIn('search', singleResult);

以及

 state.merge({ 'search': singleResult });

似乎都不起作用。预期的结果是将单个结果推送到状态Map()(而不是像.set那样覆盖它)。所以期望的结果最终看起来像这样:

 {
    results: { singleResult pushed or merged into here with other results }
 }

我不确定如何使用immutablejs执行此操作,我们将非常感谢任何建议。谢谢!

1 个答案:

答案 0 :(得分:9)

您需要为此使用更新。合并不会在密钥中将数组连接在一起。

state.update('search', search => search.concat(singleResult));

还要注意,如果搜索包含一个普通的JS数组 - 那么数组本身仍然是一个可变数据结构。除非你使用fromJS(),否则Immutable.JS不会对数据类型进行深度转换。