在Redux中构建存储

时间:2018-03-19 11:01:35

标签: javascript reactjs ecmascript-6 redux react-redux

有没有办法以这样的方式构造const reducer = (state = initialState, action),使得该方法不被一堆交换机案例臃肿?

我的想法是将相关操作放在数组中,并在处理操作时使用Array.prototype.includes()进行检查。

然后,我将提取与新方法中的特定操作相关的切换案例(例如,List组件将具有LIST_ADDLIST_REMOVE等)并调用这些方法而不是只是在const reducer = (state = initialState, action)方法中运行了100个案例。

这会影响绩效,但至少会有结构化。

有更好的想法吗?

3 个答案:

答案 0 :(得分:1)

正式的Redux docs提供了这个非常方便的缩减器创建器:

function createReducer(initialState, handlers) {
  return function reducer(state = initialState, action) {
    if (handlers.hasOwnProperty(action.type)) {
      return handlers[action.type](state, action)
    } else {
      return state
    }
  }
}

可让您按如下方式创建减速器:

const reducer = createReducer(initialState, {
  [actionType.ACTION1]: specificActionReducer1,
  [actionType.ACTION2]: specificActionReducer2,
}

没有切换声明!

答案 1 :(得分:0)

我使用一个名为reduxsauce的库,它不需要大的switch语句。

https://github.com/infinitered/reduxsauce

相反,它使用以下语法将操作绑定到方法:

export const INITIAL_STATE = {
    values: {},
}

export const reducerFunction = (state, action) => {
    const values = action.value;

    return {
        ...state,
        values,
    };
};

// map the action types to the reducer functions
export const HANDLERS = {
    [Type.ACTION_NAME]: reducerFunction,
    ...
}

// call createReducer to magically tie it all together
export default createReducer(INITIAL_STATE, HANDLERS);

答案 2 :(得分:0)

您也可以尝试redux-named-reducers。允许你像这样组成缩减器:

moduleA.reduce(SOME_ACTION, action => ({ state1: action.payload }))
moduleA.reduce(SOME_OTHER_ACTION, { state2: "constant" })

它具有能够在任何地方访问reducer状态的额外好处,例如在mapDispatchToProps中:

const mapDispatchToProps = dispatch => {
  return {
    onClick: () => {
      dispatch(someAction(getState(moduleA.state1)));
    }
  };
};