2017-04-12 83 views
0

我目前正在使用react-redux和Immutable.js。我刚刚意识到,我店里的每个领域都是不可变的类型。但是,当我console.log存储,它实际上是一个对象,其中的值是不可变的类型。商店本身仍然是一个对象。为什么我的redux商店不是不可变的?

我创建一个名为configStore的自定义功能,在这里我用compose添加中间件,devtools,等等。然后我打电话configStore实际创建我的商店,这需要一个空对象作为初始状态。当我CONSOLE.LOG我店里,我得到的是这样的:

Object { 
    keyA: Map(), 
    keyB: OrderedMap(), 
    ... 
} 

这似乎矛盾的是我一直在做我的整个应用程序,其中选择走在全州,以获得在存储数据。例如,我会做一些事情,如(state) => state.keyA.getIn(nestedKey, furtherNestedKey)getIn()是ImmutableJS API。

这使我所担心我几个问题:

  • 如果state是一个对象,如当我CONSOLE.LOG商店,怎能一成不变的与它交互?

  • 有一个非不可变的存储(其中包含不可变的数据类型),击败了使用Immutable和React-redux的目的?

+0

该代码片段('state.keyA.getIn ...')意味着不可变**不**与外部对象交互。 –

+0

'Immutable.js'不是使JS对象不可变的唯一方法。你也可以使用'freeze()'我认为REDX在'combineReducers'中做的事情。尽管使用immutables根本不需要。这只是帮助你保持数据的变异。 – Sulthan

+0

@OliverCharlesworth啊。你是绝对正确的。尽管有缺点吗?我的商店是一个带有不可变类型的对象似乎不正确。 – AlanH

回答

0

不可变的只提供了最常用的数据结构集的不可变版本,如ListMapSet,等它不符合国家直接交互,而不是你可以使用它的数据结构中的一些状态的属性,例如,存储一组对象。你应该使用Immutable,这样你可以在不改变状态的情况下操作这些数据结构。以一个例子下面的代码,假设你有一个返回的物品数组的操作:

import Immutable from 'immutable'; 

reducer = (state = { 
    articlesLoaded: false, 
    articles: Immutable.List(), 
}, action) => { 
    switch(action.type) { 
    case "GET_ARTICLES": 
     return { 
     ...state, 
     articlesLoaded: true, 
     articles: Immutable.List(action.articles) 
     }; 
    default: 
     return state; 
    } 
} 

使用不可变的目的纯粹是方便,因为它可以更容易地避免在数据结构突变。当然,你可以拥有一个不是不可变数据结构的商店,事实上这是最常见的用例。重要的是要注意,对象的不变性不取决于对象本身,而是取决于你操作它的方式(你不这样做,你创建一个新对象),所以你也可以在使用Immutable时改变状态如果你真的搞砸了。

如果你wan't全力以赴与不可变redux-immutablecombineReducers修改后的版本,使用不可变的数据结构,所以你可以有定义为Immutable.Map整个国家。

相关问题