Redux 是否可以创建访问状态树多个分支的选择器?
我正在进行一个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:
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)
这将使用库以不同的方式组合减速器