Redux 还原剂的正确使用
我不明白这意味着什么。如果我有两个包含相同操作的reducer函数,是否应该使用它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): ...
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
* }
*/
用例
-每个reducer管理自己的状态片(例如combinereducer
和state.todo
)。这在创建根减速器时非常有用state.logging
-每个减速器管理相同的状态。这在链接多个本应在同一状态下运行的减速器时非常有用(例如,当组合使用减速器减速器
from创建的多个减速器时,可能会发生这种情况)handleAction
与最终状态形状的区别是明显的。我也不知道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的项目。如果已修复,您希望我从答案中删除警告
段吗?