2017-04-01 11 views
1

我一個終極版的項目正與一幫減速器,它們被組合是否可以創建一個訪問狀態樹的多個分支的選擇器?

const rootReducer = combineReducers({ 
    reducer1, 
    reducer2, 
    ... 
}); 

的減速每次更新商店

sampleStore = { 
    reducer1: {a1: 7, b1: 5, c1: 6, ...}, 
    reducer2: {a2: 3, b2: 2, c2: 9, ...}, 
    reducer3: {a3: 1, b3: 4, c3: 2, ...}, 
    ... 
} 

現在我嘗試添加邏輯的一個分支,需要訪問到商店的兩個分支,而不用重新構建整個項目。例如,我想要一個能夠執行的減速器:set c3 = f(a1, a2)

目前我正在嘗試使用重新選擇,但我迷路了。在reducer1/selector.js我

export const derivedVariableSelector = createSelector(
    a1Selector, 
    a2Selector, 
    (a1, a2) => a1 + a2 
); 

,我試圖創建一個減速

function setC3(state) { 
    return Object.assign({}, state, { 
     c3: state.c3 + derivedVariableSelector(state) 
    }); 
} 

然而,當setC3被調用,derivedVariableSelector將永遠不會得到足夠的店裏做其工作。要麼它會收到包含a1的分支或包含a2的分支,但我不知道提供這兩種方法。這可能嗎?

回答

2

簡短答案是「否」,只要您使用combineReducers來合併所有縮減者。

較長的答案是從redux documentation採取:包括

的combineReducers實用與終極版是非常有用的,但 有意限制處理單個常見的情況:更新 狀態樹是一個簡單的Javascript對象,通過委託工作 更新每個切片狀態到特定的切片減速器。它確實不處理其他用例,例如由一個由 Immutable.js地圖組成的狀態樹,試圖將狀態樹的其他部分作爲 作爲 向片縮減器添加額外參數,或者執行 片的「排序」( slice)減速器呼叫。它也不關心給定的切片減速器 如何工作。

然後,常見問題是「我怎樣才能使用combineReducers來處理這些其他用例?」。答案很簡單:「你不需要 - 你可能需要使用別的東西」。一旦你通過核心 聯合減速器的使用案例,是時候使用更多的「定製」減速器邏輯,無論是一次性用例的特定邏輯還是可廣泛共享的可重用函數。

在文檔的同一頁是how the create reducers that share more of the state的一些建議,但它會比comibineReducers更手動。

我還沒有嘗試過這樣的事我自己,但在文檔下面的例子,這樣的事情可能會爲你工作:

import { combineReducers } from 'redux' 
import reduceReducers from 'reduce-reducers' 

const reducer1 = (state = {}, action) => { 
    switch (action.type) { 
     // handle actions 
     default: 
      return state 
    } 
} 

const reducer2 = (state = {}, action) => { 
    switch (action.type) { 
     // handle actions 
     default: 
      return state 
    } 
} 

const reducer3 = (state) => { 
    return { 
     ...state, 
     // use the root state for the reducerC value 
     reducerC: makeValue(state.reducer1, state.reducer2) 
    } 
} 

const rootReducer = reduceReducers(combineReducers({reducer1, reducer2}), reducer3) 

它使用庫reduce-reducers到減速器以不同的方式結合起來。

+0

工作完美,謝謝。 –

相關問題