TypeScript
にredux
を含むReactJSアプリがあり、redux-toolkit
を使用してリデューサーを構築しています。アプリが大きくなったので、レデューサーのリファクタリングを開始したいと思います。
私のredux状態は次のようになります。
{
customers: Customers[],
orders: {
state1: SomeIndependentState1,
state2: SomeIndependentState2,
state3: SomeDependentState2,
state4: SomeDependentState3,
}
}
customers
スライスとorders
スライスは独立しており、2つの別々のレデューサーを簡単に記述して、後でcombineReducers
と組み合わせることができます。
ここで、orders
リデューサーをさらに分解したいと思います。
state1
とstate2
は完全に独立しています。state3
はstate1
のデータに依存します。state4
は、state1
およびstate2
のデータに依存します。createReducer
内にorders
を引き続き使用して、redux-toolkit
(またはツールキットのその他の機能)を使用して、各ネストされたスライスにレデューサーを作成する方法はありますか?スライス?
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(...)
);
注:私は自分のredux状態の構造を制御できません。私はredux-toolkit
の使用に完全に縛られているわけではありませんが、チームがそれから離れるようにするには正当な根拠が必要です。
必要なすべてを減速機に渡すだけです。この場合、state1
、state2
、state3
などを渡す代わりに、orders
状態全体を渡します。
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(...)
);
state
の名前をorders
に変更しました。正規のドキュメントはstate
を頻繁に使用することは知っていますが、非常に混乱しやすくなります。
もちろん、これはstate3
が古いstate1
に依存している場合です。新しい値に依存する場合、アクションでstate3
が必要とするすべてのデータと、古いstate1
が必要です。 (これは上記のソリューションに戻ります)。そうしないと、レデューサーは純粋な関数ではありません。
レデューサーについてあまり強調しないでください。それらは純粋な関数である必要がありますが、任意の数とタイプの引数を持つことができ、何でも返すことができます。彼らは常に「関連する州の小道具と関連する州の小道具」を厳密に一致させる必要はありません。