Redux项目能否混用传统switch reducer与createSlice
答案
完全可行。Redux Toolkit 从设计层面就完全兼容原生 Redux 的所有标准写法,支持增量迁移,不需要一次性把所有旧代码改造成createSlice写法。你完全可以保持存量switch case版reducer不动,后续新增功能用createSlice开发,等后续有空闲时间再逐步迁移旧逻辑即可。
你当前示例代码的问题
你现在写的两个独立reducer(旧switch版articleReducer、createSlice生成的articleReducerr)是互不关联的独立函数,直接同时导出无法让store同时生效两套逻辑,需要把两者合并为同一个reducer,挂载到store对应的state字段下。
最小改动的合并方案
createSlice生成的reducer本质就是标准Redux reducer函数(接收(state, action)、返回新state),你不需要改动任何旧逻辑,只需要在旧reducer的default分支把未匹配到旧规则的action交给slice生成的reducer处理即可:
// 原有旧reducer逻辑完全保留,不需要修改 export function articleReducer( state = initialState, action: articleReducerAction ) { switch (action.type) { case ActionType.GET_A: return { ...state, books: action.payload, }; case ActionType.GET_B: return { ...state, libraries: action.payload, }; default: // 所有旧逻辑未匹配的action,交给新的slice reducer处理 return articleSlice.reducer(state, action) } } // 新增的createSlice逻辑 export const articleSlice = createSlice({ // name字段要和该切片在store中挂载的key一致,之前写的"app"会导致生成的action type前缀错误 name: "article", // 直接复用旧reducer的同一份initialState,不要重复定义,避免初始状态不一致 initialState, reducers: { GET_C: (state, action) => { state.books = action.payload; }, GET_D: (state, action) => { state.libraries = action.payload; }, }, }); export const { GET_C, GET_D } = articleSlice.actions;
最后在configureStore的reducer配置里,直接使用合并后的articleReducer即可,不需要额外调整其他配置。
注意要点
- 两种写法的状态更新逻辑可以完全共存:旧代码手动返回新对象的 immutable 写法、createSlice里直接修改state的写法都能被Redux Toolkit内置的Immer正确处理,不会出现状态突变问题。
- 后续迁移旧逻辑时,只需要把switch里的case逐个挪到slice的
reducers配置中,挪完一个删一个对应case即可,迁移过程不会影响项目正常运行。 - 不要给同一个state切片重复挂载两个独立reducer,否则只有后执行的reducer逻辑会生效。
内容的提问来源于stack exchange,提问作者walee
相关产品推荐
相关产品推荐

