K M*_*hta 5 reactjs react-redux redux-toolkit
我有一个ReactJS应用TypeScript与redux和我用redux-toolkit建立我的减速器。随着应用程序变得越来越大,我想开始重构我的减速器。
我的 redux 状态如下所示:
{
customers: Customers[],
orders: {
state1: SomeIndependentState1,
state2: SomeIndependentState2,
state3: SomeDependentState2,
state4: SomeDependentState3,
}
}
Run Code Online (Sandbox Code Playgroud)
在customers和orders片是独立的,我可以很容易地写出两个不同的减速对他们来说,他们结合combineReducers后。
现在,我想进一步分解我的orders减速器。
state1并且state2是完全独立的。state3取决于来自 的数据state1。state4取决于来自state1和 的数据state2。有没有办法继续使用createReducerfrom redux-toolkit(或工具包中的其他功能)为切片中的每个嵌套切片创建减速器orders?
当我开始为 重写我的 reducer 时orders,这是我到目前为止所拥有的:
export const ordersReducer = (state: Orders, action: AnyAction) => {
return {
state1: state1Reducer(state?.state1, action),
state2: state2Reducer(state?.state2, action),
state3: {}, // not sure how to write a reducer for this slice and satisfy its dependency on state1
state4: {}, // not sure how to write a reducer for this slice and staisfy its dependency on state1 and state2
}
};
const initialState1: State1 = {};
export const state1Reducer = createReducer(initialState1, (builder) =>
builder
.addCase(...)
.addCase(...)
);
const initialState2: State2 = {};
export const state2Reducer = createReducer(initialState2, (builder) =>
builder
.addCase(...)
.addCase(...)
);
Run Code Online (Sandbox Code Playgroud)
注意:我无法控制我的 redux 状态的结构。我并不完全依赖于使用,redux-toolkit但需要一个很好的理由让我的团队远离它。
小智 1
只需将所有内容传递给它需要的减速器即可。在这种情况下,我将传递整个orders状态而不是传递state1、state2、state3等。
export const ordersReducer = (orders: Orders, action: AnyAction) => {
return {
// ...
state3: state3Reducer(orders, action),
// ...
}
};
const initialState3: State3 = {};
export const state3Reducer = createReducer(initialState3, (builder) =>
builder
.addCase(someAction, (orders, action) => orders.state3 + orders.state1) // or anything else
.addCase(...)
);
Run Code Online (Sandbox Code Playgroud)
我重命名state为orders. 我知道规范文档使用了state很多,但这很快就会变得非常混乱。
这当然state3取决于旧的state1。state3如果它取决于新值,那么您必须拥有操作和旧值所需的所有数据state1。(这又回到了上面的解决方案)。如果不这样做,你的减速器就不是纯函数。
不要对您的减速器过分强调。它们必须是纯函数,但它们可以具有任意数量和类型的参数并返回任何内容。他们并不总是必须严格匹配“相关状态道具与相关状态道具”。
| 归档时间: |
|
| 查看次数: |
769 次 |
| 最近记录: |