有没有办法以这样的方式构造const reducer = (state = initialState, action)
,使得该方法不被一堆交换机案例臃肿?
我的想法是将相关操作放在数组中,并在处理操作时使用Array.prototype.includes()
进行检查。
然后,我将提取与新方法中的特定操作相关的切换案例(例如,List
组件将具有LIST_ADD
,LIST_REMOVE
等)并调用这些方法而不是只是在const reducer = (state = initialState, action)
方法中运行了100个案例。
这会影响绩效,但至少会有结构化。
有更好的想法吗?
答案 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)));
}
};
};