在我的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执行此操作,我们将非常感谢任何建议。谢谢!
答案 0 :(得分:9)
您需要为此使用更新。合并不会在密钥中将数组连接在一起。
state.update('search', search => search.concat(singleResult));
还要注意,如果搜索包含一个普通的JS数组 - 那么数组本身仍然是一个可变数据结构。除非你使用fromJS(),否则Immutable.JS不会对数据类型进行深度转换。