Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Redux:当一个操作到达时,state如何知道应该选择哪个子reducer?_Javascript_Redux - Fatal编程技术网

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'
})