如何在Redux中使用CombineReducer和Custom Reducer?

时间:2020-06-11 22:20:37

标签: reactjs typescript redux react-redux

当前,我所有的化简只需要状态值中的数据,所以我的'rootReducer'看起来像这样

export const appReducer = combineReducers({ foo: fooReducerFunction, bar: barReducerFunction})

这很好,但是现在我有一个需要状态的其他部分的减速器,而且我知道可以这样完成

export function App(state: AppState, action: AppActions): AppState {
    return {
       foo: fooReducerFunction(state.foo, action),
       bar: fooReducerFunction(state.bar, action),
       baz: bazReducerFunction({foo: state.foo, bar: state.bar}, action)
    } 
}

但是当我只有一部分商店需要商店的其他部分时,我不想像foobar那样显式地写出所有其他化简器。有什么方法可以将自定义的reducer和combineReducers组合成这样的东西?

const appReducer = combineReducers({ foo: fooReducerFunction, bar: barReducerFunction})

export function App(state: AppState, action: AppActions): AppState {
    return {
       ...appReducer,
       baz: bazReducerFunction({foo: state.foo, bar: state.bar}, action)
    } 
}

1 个答案:

答案 0 :(得分:0)

有可能以这种方式组合化简器,但是对您的问题更简单的解决方案是在操作中获取redux存储的快照并将所需的状态片传递给您减速器在派遣时。例如,如果您使用的是redux-thunk,则以下模式应适用:

export const actionFoo = (data) =>  {
  return (dispatch, getState) => {
    // access slice of state first
    const { otherStateSlice } = getState()
    dispatch({ type: UPDATE_DATA, otherStateSlice, data })
  }
}