【发布时间】:2017-04-12 16:23:20
【问题描述】:
我目前正在使用 react-redux 和 Immutable.js。我刚刚意识到我商店中的每个字段都是不可变的类型。但是,当我 console.log 存储时,它实际上是一个对象,其中的值是不可变类型的。商店本身,仍然是一个对象。
我创建了一个名为configStore 的自定义函数,其中我使用compose 添加中间件、devtools 等。然后我调用configStore 来实际创建我的商店,它将一个空对象作为初始状态。当我 console.log 我的商店时,我会得到如下信息:
Object {
keyA: Map(),
keyB: OrderedMap(),
...
}
这似乎与我在整个应用程序中一直在做的事情相矛盾,其中选择器获取整个状态以获取商店中的数据。例如,我会做一些诸如(state) => state.keyA.getIn(nestedKey, furtherNestedKey) 之类的事情。 getIn() 是一个 ImmutableJS API。
这让我有几个让我担心的问题:
如果
state是一个对象,如我在console.log store时显示的那样,Immutable如何与之交互?是否有一个非 Immutable 存储(其中包含 Immutable 数据类型),违背了使用 Immutable 和 React-redux 的目的?
【问题讨论】:
-
代码 sn-p (
state.keyA.getIn...) 暗示 Immutable 不与外部对象交互。 -
Immutable.js是不是使 JS 对象不可变的唯一方法。你也可以使用freeze()我认为 redux 在其combineReducers中所做的事情。不过,根本不需要使用不可变对象。这只是防止你改变数据的帮手。 -
@OliverCharlesworth 啊。你是绝对正确的。不过有什么缺点吗?我的商店是不可变类型的对象,这似乎不对。
-
@Sulthan 是的,这就是不可变的全部意义所在。那么外部对象不应该也是不可变的吗?
-
@AlanH 你可以让它们不可变。您是调用
combineReducers的人,如果您愿意,可以将该结果转换为不可变的。
标签: reactjs react-redux immutable.js