Redux中能否将createSlice的reducer动作统一到单独文件调用?是否推荐?
问题:统一从
sourcesActions.ts导入所有Redux动作 我在store/slices/sourcesSlice.ts中设置了如下Redux切片:
import { addInitialSources} from "store/slices/sourcesActions.ts"; export const sourcesSlice = createSlice({ name: "sourcesSlice", initialState, reducers: { addSource: (state, action: PayloadAction<SourceInterface>) => { state.sources.push(action.payload); }, changeName: (state) => { state.naming = "Bob Marley"; }, }, extraReducers: (builder) => { builder .addCase(addInitialSources.fulfilled, (state, { payload }) => { state.loading = false; state.sources = payload; }) }, }); export const { addSource, changeName } = sourcesSlice.actions;
目前addSource、changeName从sourcesSlice.ts导出,addInitialSources从sourcesActions.ts导出,所有动作均相关。我希望能从sourcesActions.ts统一导入所有动作,即:
import { addInitialSources, addSource, changeName} from "store/slices/sourcesActions.ts";
而非分两个文件导入:
import { addInitialSources} from "store/slices/sourcesActions.ts"; import { addSource, changeName} from "store/slices/sourcesSlice.ts";
请问在保留createSlice代码于sourcesSlice.ts的前提下,是否可以实现该需求?同时该方案是否推荐?
回答
可以实现,具体步骤如下:
只需要在sourcesActions.ts中导入sourcesSlice.ts导出的同步动作,再重新统一导出即可:
// sourcesActions.ts // 1. 保留原有异步动作的定义 export const addInitialSources = createAsyncThunk( 'sources/addInitialSources', async () => { // 你的原有异步逻辑 } ); // 2. 从slice文件导入自动生成的同步动作 import { addSource, changeName } from './sourcesSlice'; // 3. 统一导出所有动作 export { addSource, changeName };
这样就能从sourcesActions.ts一次性导入所有相关动作了。需要注意:由于sourcesSlice.ts已经导入了addInitialSources,这里会形成循环导入,但ES模块的循环引用是允许的(基于引用传递的特性),只要确保代码执行顺序没问题——比如createSlice的执行不会依赖还未初始化的动作,就不会有问题。
该方案是否推荐?
- 推荐场景:如果你的项目追求更少的导入语句、更整洁的组件代码,或者希望把某个模块的所有动作集中在一个入口,这种做法完全可行。
- 需要注意的点:
- 后续如果在
sourcesSlice.ts中新增同步动作,必须同步在sourcesActions.ts中导出,否则组件无法从统一入口拿到新动作 - 若项目规模较大,这种方式可能会让
sourcesActions.ts职责变得模糊(既定义异步动作,又导出同步动作),此时更推荐用一个单独的index.ts作为聚合入口,比如store/slices/sources/index.ts,把slice和actions的导出都放在这里:
这样组件可以从// store/slices/sources/index.ts export { addInitialSources } from './sourcesActions'; export { addSource, changeName } from './sourcesSlice'; // 甚至可以导出slice本身 export { sourcesSlice } from './sourcesSlice';store/slices/sources统一导入,结构更清晰,也避免了动作文件的职责混杂。
- 后续如果在
内容的提问来源于stack exchange,提问作者relidon
相关产品推荐
相关产品推荐

