2017-04-01 9 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

工作完美,谢谢。 –

相关问题