2017-04-12 86 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整個國家。

相關問題