拆分减速器在 redux 中对同一数据片进行操作
Split reducers operating on the same slice of data in redux
我有一家形状如下的商店:
{
// ...data
user: {
warranties: {
W_1: ['O_1', 'O_2'],
W_2: ['O_3', 'O_4']
}
}
}
以 W_
开头的关键字是保修,以 O_
开头的关键字是选项。
对于每个 warranty 我有一个或多个 options 与之关联,user.warranties
中的关系采用以下形式: warranty => [options]
.
为了实现它,我像这样组合我的减速器:
rootReducer = combineReducers({
// ...other main reducers
user: combineReducers({
// ...other user reducers
warranties
})
})
现在,“问题”是 USER_WARRANTY
和 USER_OPTION
操作都由同一个 reducer 处理,因为:
添加选项时,我需要将其推送到正确的保修条目。
相反,当我添加保修时,我需要使用默认选项填充它。
最终,它们对同一片数据进行操作
所以 warranties
reducer 必须对这两个动作做出反应,如下所示:
export default function warranties(state = {}, action) {
switch (action.type) {
case USER_WARRANTIES_ADD:
// add warranty key to `user.warranties`
case USER_WARRANTIES_REMOVE:
// remove warranty key from `user.warranties`
case USER_OPTIONS_ADD:
// push option to `user.warranties[warrantyID]`
case USER_OPTIONS_REMOVE:
// remove option from `user.warranties[warrantyID]`
default:
return state
}
}
我想把它分成两个减速器,warranties
和 options
,但仍然让它们在同一数据片上运行。
理想情况下,我会这样编写我的根减速器:
rootReducer = combineReducers({
// ...other main reducers
user: combineReducers({
// ...other user reducers
warranties: magicalCombine({
warranties,
options
})
})
})
其中 magicalCombine
是我找不到的函数。
我已经尝试了 reduce-reducers
,但看起来好像从未真正达到第二个减速器 (options
),而且我实际上不确定它,因为我并没有尝试达到平坦状态, 但实际上是在同一个键上操作。
reducer 是一个简单的函数,它接受 state
和 action
以及 returns 一个新的状态对象,所以我认为这会做你想要的..
rootReducer = combineReducers({
// ...other main reducers
user: combineReducers({
// ...other user reducers
warranties: (state, action) => {
// state is state.user.warranties
// we pass it to each reducer in turn and return the result
state = warranties(state, action);
return options(state, action);
}
})
})
使用 reduceReducers 应该做同样的事情(我以前没有用过它,但这就是它的样子..)
rootReducer = combineReducers({
// ...other main reducers
user: combineReducers({
// ...other user reducers
warranties: reduceReducers(warranties, options)
})
})
来自 redux 的 combineReducers
只是有意限制为仅传递与提供给它的 reducers 对象中的键匹配的状态 属性 的值,它在任何其他方面都不是特别的。在这里查看更多.. https://redux.js.org/recipes/structuringreducers/beyondcombinereducers
我有一家形状如下的商店:
{
// ...data
user: {
warranties: {
W_1: ['O_1', 'O_2'],
W_2: ['O_3', 'O_4']
}
}
}
以 W_
开头的关键字是保修,以 O_
开头的关键字是选项。
对于每个 warranty 我有一个或多个 options 与之关联,user.warranties
中的关系采用以下形式: warranty => [options]
.
为了实现它,我像这样组合我的减速器:
rootReducer = combineReducers({
// ...other main reducers
user: combineReducers({
// ...other user reducers
warranties
})
})
现在,“问题”是 USER_WARRANTY
和 USER_OPTION
操作都由同一个 reducer 处理,因为:
添加选项时,我需要将其推送到正确的保修条目。
相反,当我添加保修时,我需要使用默认选项填充它。
最终,它们对同一片数据进行操作
所以 warranties
reducer 必须对这两个动作做出反应,如下所示:
export default function warranties(state = {}, action) {
switch (action.type) {
case USER_WARRANTIES_ADD:
// add warranty key to `user.warranties`
case USER_WARRANTIES_REMOVE:
// remove warranty key from `user.warranties`
case USER_OPTIONS_ADD:
// push option to `user.warranties[warrantyID]`
case USER_OPTIONS_REMOVE:
// remove option from `user.warranties[warrantyID]`
default:
return state
}
}
我想把它分成两个减速器,warranties
和 options
,但仍然让它们在同一数据片上运行。
理想情况下,我会这样编写我的根减速器:
rootReducer = combineReducers({
// ...other main reducers
user: combineReducers({
// ...other user reducers
warranties: magicalCombine({
warranties,
options
})
})
})
其中 magicalCombine
是我找不到的函数。
我已经尝试了 reduce-reducers
,但看起来好像从未真正达到第二个减速器 (options
),而且我实际上不确定它,因为我并没有尝试达到平坦状态, 但实际上是在同一个键上操作。
reducer 是一个简单的函数,它接受 state
和 action
以及 returns 一个新的状态对象,所以我认为这会做你想要的..
rootReducer = combineReducers({
// ...other main reducers
user: combineReducers({
// ...other user reducers
warranties: (state, action) => {
// state is state.user.warranties
// we pass it to each reducer in turn and return the result
state = warranties(state, action);
return options(state, action);
}
})
})
使用 reduceReducers 应该做同样的事情(我以前没有用过它,但这就是它的样子..)
rootReducer = combineReducers({
// ...other main reducers
user: combineReducers({
// ...other user reducers
warranties: reduceReducers(warranties, options)
})
})
来自 redux 的 combineReducers
只是有意限制为仅传递与提供给它的 reducers 对象中的键匹配的状态 属性 的值,它在任何其他方面都不是特别的。在这里查看更多.. https://redux.js.org/recipes/structuringreducers/beyondcombinereducers