Javascript Redux:当一个操作到达时,state如何知道应该选择哪个子reducer?
在阅读图书馆的文档时,我有一个关于Javascript Redux:当一个操作到达时,state如何知道应该选择哪个子reducer?,javascript,redux,Javascript,Redux,在阅读图书馆的文档时,我有一个关于combinereducer的问题 第1阶段:单减速器 当我们只有一个减速器时,它可以处理各种动作类型 export default function counter(state = 0, action) { switch (action.type) { case 'INCREMENT': return state + 1 case 'DECREMENT': return state - 1 case 'FOO
combinereducer
的问题
第1阶段:单减速器
当我们只有一个减速器时,它可以处理各种动作类型
export default function counter(state = 0, action) {
switch (action.type) {
case 'INCREMENT':
return state + 1
case 'DECREMENT':
return state - 1
case 'FOO'
return state + 100
case 'BAR'
return state - 100
case 'SHOW_ME_THE_MONEY'
return state + 10000000000
default:
return state
}
}
第二阶段:我们将它们分为不同的减速器
好吧,你有一个代码审查员说,让一个上帝减速器来处理所有操作是不好的。请创建不同的减速器来执行不同的操作
- 作弊:给我钱/食物/酒吧
- 计数器:递增/递减
FOO
到达时,状态如何知道应该选取哪个子减速器并用于计算新状态
我认为动作类型和reducer之间的映射是必要的,但它似乎没有必要,文档中对此进行了演示
- FOO->cheat reducer
- 横杆->异径管
- 让我看看钱->欺骗减速机
- 增量->计数器减速器
- 减量->计数器减量器
组合减速机
仅在您的子减速机密钥(作弊
,计数器
)和相应的状态片(状态.作弊
,状态.计数器
)之间进行映射
将引导您了解称为减速器组合的概念
子约简器接收所有操作,但仅接收其状态切片:
let{
createStore,
组合传感器
}=重复
函数欺骗(状态=0,操作){
日志(“接收操作:”,操作类型)
log(“欺骗缩减器切片:”,状态)
开关(动作类型){
案例“FOO”:
返回状态+100
“酒吧”一案:
返回状态-100
案例“给我钱看”:
返回状态+1000000000
违约:
返回状态
}
}
功能计数器(状态=0,动作){
log(“计数器减速机接收操作:”,操作.type)
log(“计数器减速机切片:”,状态)
开关(动作类型){
案例“增量”:
返回状态+1
“减量”一案:
返回状态-1
违约:
返回状态
}
}
let combined=组合减速机({
欺骗,
柜台
})
let store=createStore(组合)
store.subscribe(()=>console.log(“存储状态:”,store.getState()))
仓库调度({
类型:“增量”
})
仓库调度({
类型:“增量”
})
仓库调度({
类型:“FOO”
})
仓库调度({
类型:'BAR'
})
仓库调度({
输入:“给我钱”
})
这个官方的redux常见问题解答是由@louisbl作为评论提供的,但我认为它非常有用,值得作为答案公开
一个给定的操作可以由所有人、部分人或任何人来处理。这使组件与实际的数据更改保持解耦,因为一个操作可能会影响状态树的不同部分,组件不需要知道这一点。有些用户确实选择将它们更紧密地绑定在一起,例如“ducks”文件结构,但是默认情况下肯定没有一对一的映射,并且您应该在任何时候打破这种范式,您需要在许多reducer中处理某个操作
另一个相关问题是:
它不选择子减速机,而是同时调用这两个减速机。这就是为什么分享一个动作名称不是一个好主意。你是说这是一种对所有儿童还原者的广播?有趣。如果两个还原程序都能够处理相同的
操作类型
,它们将更新自己相应的状态片。我理解正确吗?没错。有关减速器和动作之间关系的更多信息,请参阅。
export default function cheat(state = [], action) {
switch (action.type) {
case 'FOO'
return state + 100
case 'BAR'
return state - 100
case 'SHOW_ME_THE_MONEY'
return state + 10000000000
}
}
export default function counter(state = 0, action) {
switch (action.type) {
case 'INCREMENT':
return state + 1
case 'DECREMENT':
return state - 1
default:
return state
}
}
import { combineReducers } from 'redux'
import todos from './cheat'
import counter from './counter'
export default combineReducers({
cheat,
counter
})
store.dispatch({
type: 'SHOW_ME_THE_MONEY',
text: 'To Buy new Macbook Pro 16'
})