6

我有一个 ReactJS 应用程序,TypeScriptredux正在使用redux-toolkit它来构建我的减速器。随着应用程序变得越来越大,我想开始重构我的减速器。

我的 redux 状态如下所示:

{
  customers: Customers[],
  orders: {
    state1: SomeIndependentState1,
    state2: SomeIndependentState2,
    state3: SomeDependentState2,
    state4: SomeDependentState3,
  }
}

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(...)
);

注意:我无法控制我的 redux 状态的结构。我并不完全依赖于使用redux-toolkit,但需要一个很好的理由让我的团队远离它。

4

1 回答 1

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(...)
);

我重命名stateorders. 我知道规范文档使用state了很多,但这很快就会变得非常混乱。

这当然是state3取决于旧的state1。如果它取决于新值,那么您必须拥有state3操作中需要的所有数据和旧值state1。(这又回到了上述解决方案)。如果你不这样做,你的 reducer 就不是纯函数。

不要对减速器过分强调。它们必须是纯函数,但它们可以有任意数量和类型的 args 并返回任何内容。他们并不总是必须严格匹配“相关状态道具与相关状态道具”。

于 2020-05-12T20:52:09.117 回答