Redux 是否可以创建访问状态树多个分支的选择器?

Redux 是否可以创建访问状态树多个分支的选择器?,redux,react-redux,reselect,Redux,React Redux,Reselect,我正在进行一个Redux项目,其中包含一系列合并的还原程序 const rootReducer = combineReducers({ reducer1, reducer2, ... }); 每个还原器更新存储的一个分支 sampleStore = { reducer1: {a1: 7, b1: 5, c1: 6, ...}, reducer2: {a2: 3, b2: 2, c2: 9, ...}, reducer3: {a3: 1, b3:

我正在进行一个Redux项目,其中包含一系列合并的还原程序

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的分支,但我不知道如何同时提供这两个分支。这可能吗?

简短的回答是“不”,只要您使用
组合减速器来组合所有减速器

较长的答案取自:

Redux中包含的combinereducer实用程序非常有用,但它是 故意限制处理单个常见用例:更新 状态树,它是一个普通的Javascript对象,通过委托工作 将每个状态片更新为特定的片缩减器。是的 不处理其他用例,例如由 Immutable.js映射,尝试将状态树的其他部分作为 切片缩减器的附加参数,或执行 切片还原器调用。它也不关心给定的切片缩减器如何 做它的工作

那么,常见的问题是“我如何使用合并器来处理 这些其他用例。答案很简单:“你没有- 你可能需要用别的东西”。一旦你越过核心 对于组合减速器的用例,是时候使用更多“自定义”减速器了 逻辑,无论是一次性用例的特定逻辑,还是 可广泛共享的可重用功能

在文档的同一页上有一些建议,但它将比
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)
这将使用库以不同的方式组合减速器