Redux 还原剂的正确使用

Redux 还原剂的正确使用,redux,reducers,Redux,Reducers,我不明白这意味着什么。如果我有两个包含相同操作的reducer函数,是否应该使用它 function reducerA(state, action){ switch(action.type): ... case 'SAME_ACTION': {...state, field: state.field+1} } function reducerB(state, action){ switch(action.type): ...

我不明白这意味着什么。如果我有两个包含相同操作的reducer函数,是否应该使用它

function reducerA(state, action){
   switch(action.type):
       ...
       case 'SAME_ACTION': {...state, field: state.field+1}
}

function reducerB(state, action){
   switch(action.type):
       ...
       case 'SAME_ACTION': {...state, field: state.field*2}
}
因此,如果我在
reducerA
reducerB
上调用
reduceReducer
,并为
{field:0}
调用动作“SAME_action”,那么我将有一个下一个状态
{field:2}

而且,在我看来,它似乎连接了一些减缩器(意味着将它们合并到一个键下)

我是对的还是减速器有不同的用途?

区别在于:

  • combinereducer
    创建嵌套的状态
  • 减速器
    创建平坦状态
考虑以下减速器。没有使事情更简单的操作类型:

//此减速机将有效负载添加到state.sum
//并跟踪操作总数
功能减速器ADD(状态、有效负载){
如果(!state)state={sum:0,totalOperations:0}
如果(!有效负载)返回状态
返回{
……国家,
总和:state.sum+有效载荷,
totalOperations:state.totalOperations+1
}
}
//此减速机将state.product乘以有效负载
//并跟踪操作总数
功能还原结果(状态、有效负载){
如果(!state)state={product:1,totalOperations:0}
如果(!有效负载)返回状态
//由于以下原因,`product`可能未定义:
//“减速器”中的小警告,见下文
const prev=state.product | | 1
返回{
……国家,
产品:prev*有效载荷,
totalOperations:state.totalOperations+1
}
}
组合传感器 每个减速器都有一个独立的状态(另请参见):

const rootReducer=combinereducer({
加:减速器add,
mult:还原结果
})
const initialState=rootReducer(未定义)
/*
* {
*添加:{sum:0,totalOperations:0},
*mult:{product:1,totalOperations:0},
* }
*/
const first=rootReducer(initialState,4)
/*
* {
*添加:{sum:4,totalOperations:1},
*mult:{product:4,totalOperations:1},
* }
*/    
//这不有趣,让我们看看第二个电话。。。
const second=rootReducer(第一,4)
/*
* {
*添加:{sum:8,totalOperations:2},
*mult:{product:16,totalOperations:2},
* }
*/
//现在很明显,两个减速器都有自己的减速器
//与之共事的一种状态
减速器 所有减速器共享相同的状态

const add and mult=reducereducer(reducerad,reducerMult)
const initial=addAndMult(未定义)
/* 
* {
*总数:0,,
*totalOperations:0
* }
*
*首先,调用reducerad,它给出初始状态{sum:0}
*其次,调用了reducerMult,它没有有效负载,因此
*只是返回状态不变。
*这就是为什么没有任何“产品”道具的原因。
*/ 
const next=addAndMult(首字母,4)
/* 
* {
*总数:4,
*产品:4,
*行动总数:2
* }
*
*首先,调用reducerad,将'sum`=0+4=4进行更改
*第二,调用reducerMult,它改变了'product`=1*4=4
*两个减速机都修改“totalOperations”`
*/
const final=addAndMult(下一步,4)
/* 
* {
*总数:8,
*产品:16,
*总数:4
* }
*/
用例
  • combinereducer
    -每个reducer管理自己的状态片(例如
    state.todo
    state.logging
    )。这在创建根减速器时非常有用
  • 减速器减速器
    -每个减速器管理相同的状态。这在链接多个本应在同一状态下运行的减速器时非常有用(例如,当组合使用
    handleAction
    from创建的多个减速器时,可能会发生这种情况)

与最终状态形状的区别是明显的。

我也不知道reduce-reducer试图解决什么问题。@Tomáš所描述的用例可以通过一个简单的减速器实现。毕竟,Reducer只是一个函数,它接受应用程序状态和操作,并返回一个包含新应用程序状态的对象。例如,您可以执行以下操作,而不是使用redux提供的CombineReducer:

import combinationReducer from "./combinationReducer";
import endOfPlayReducer from "./endOfPlayReducer";
import feedbackReducer from "./feedbackReducer";

function combineReducers(appState, action) {
  return {
    combination: combinationReducer(appState, action),
    feedbacks: feedbackReducer(appState, action),
    endOfPlay: endOfPlayReducer(appState, action)
  };
}

当然,在这里,你的简化程序接受整个应用程序状态,只返回他们负责的部分。再说一次,这只是一个函数,你可以随意定制它。你可以阅读更多关于它的信息

你错过了一些优化的机会。例如,我认为React使用
Object.is()
=
来比较状态,每次返回一个新状态可能会导致大量重新渲染。您正在创建一个嵌套结构。reduce Reducer并不是用来取代Combine Reducer,而是让两个Reducer在同一个状态片上运行。您可能有一个库提供了一个现成的缩减器,但您也有一个自定义的缩减器,您希望对同一个状态片进行操作。您可以使用ReducerReducer来组合这两个还原程序。根据,初始状态问题已得到解决。你能证实吗,@tomáš-ehrlich?@Seth很遗憾,我不能。我不参与任何仍然使用Redux的项目。如果已修复,您希望我从答案中删除
警告
段吗?