在redux中对同一数据片进行操作的拆分还原器

在redux中对同一数据片进行操作的拆分还原器,redux,store,redux-thunk,reducers,redux-store,Redux,Store,Redux Thunk,Reducers,Redux Store,我有一家商店的形状如下: 如果以W_开头的键为保修,则以O_开头的键为选项 对于每个保修我有一个或多个与之相关的选项,用户中的关系。保修的形式为:保修=>[options] 为了实现这一点,我将我的减速器组合如下: 现在,“问题”是USER\u保修和USER\u选项操作都由同一个减速器处理,因为: 添加选项时,我需要将其推送到正确的保修条目 相反,当我添加保修时,我需要用默认选项填充它 最终,它们在同一片数据上运行 因此,保修减速机必须对这两个动作做出反应,如下所示: 我想将其分为两

我有一家商店的形状如下:

如果以
W_
开头的键为保修,则以
O_
开头的键为选项

对于每个保修我有一个或多个与之相关的选项
用户中的关系。保修的形式为:
保修=>[options]

为了实现这一点,我将我的减速器组合如下:


现在,“问题”是
USER\u保修
USER\u选项
操作都由同一个减速器处理,因为:

  • 添加选项时,我需要将其推送到正确的保修条目

  • 相反,当我添加保修时,我需要用默认选项填充它

  • 最终,它们在同一片数据上运行

因此,
保修
减速机必须对这两个动作做出反应,如下所示:

我想将其分为两个减速机,
保修
选项
,但仍然让它们在同一数据片上运行

理想情况下,我会像这样编写我的根减缩器:

其中
magicalCombine
是我很难找到的函数



我已经试过了,但看起来第二个减速机(
选项
)实际上从未到达过,而且我实际上对此不确定,因为我没有尝试实现平坦状态,而是在同一个键上实际操作。

减速机是一个简单的函数,它接受
状态
操作
,并返回一个新的状态对象,所以我想这会满足你的要求

rootReducer = combineReducers({
  // ...other main reducers

  user: combineReducers({
    // ...other user reducers
    warranties: (state, action) => {
      // state is state.user.warranties
      // we pass it to each reducer in turn and return the result
      state = warranties(state, action);
      return options(state, action);
    }
  })
})
使用reducereducer应该做同样的事情(我以前没有使用过它,但它看起来就是这样的…)

redux中的组合减速机仅被有意限制为仅传递与提供给它的减速机对象中的键匹配的state属性的值,它在其他方面并不特别。在这里可以看到更多

rootReducer = combineReducers({
  // ...other main reducers

  user: combineReducers({
    // ...other user reducers
    warranties
  })
})
export default function warranties(state = {}, action) {
  switch (action.type) {
    case USER_WARRANTIES_ADD:
    // add warranty key to `user.warranties`

    case USER_WARRANTIES_REMOVE:
    // remove warranty key from `user.warranties`

    case USER_OPTIONS_ADD:
    // push option to `user.warranties[warrantyID]`

    case USER_OPTIONS_REMOVE:
    // remove option from `user.warranties[warrantyID]`

    default:
      return state
  }
}
rootReducer = combineReducers({
  // ...other main reducers

  user: combineReducers({
    // ...other user reducers
    warranties: magicalCombine({
      warranties,
      options
    })
  })
})
rootReducer = combineReducers({
  // ...other main reducers

  user: combineReducers({
    // ...other user reducers
    warranties: (state, action) => {
      // state is state.user.warranties
      // we pass it to each reducer in turn and return the result
      state = warranties(state, action);
      return options(state, action);
    }
  })
})
rootReducer = combineReducers({
  // ...other main reducers

  user: combineReducers({
    // ...other user reducers
    warranties: reduceReducers(warranties, options)
  })
})