是否可以使用 Redux Toolkit 从另一个 reducer 函数(在同一切片内)调用 reducer 函数?
Posted
技术标签:
【中文标题】是否可以使用 Redux Toolkit 从另一个 reducer 函数(在同一切片内)调用 reducer 函数?【英文标题】:Is it possible to call a reducer function from another reducer function (within the same slice) using Redux Toolkit? 【发布时间】:2020-12-13 07:11:51 【问题描述】:我有这个小的模块管理片:
const WorkspaceSlice = createSlice(
name: "workspace",
initialState:
activeModule: null,
modules:
["someModule"]: ...moduleRenderingData ,
,
,
reducers:
setActiveModule(state, action)
state.activeModule = action.payload;
,
addModule(state, action)
const moduleName, renderingData = action.payload;
if (!state.modules[moduleName])
state.modules[moduleName] = renderingData;
// state.activeModule = moduleName; <- basically the same as 'setActiveModule'
this.setActiveModule(state, action.payload.module); // <- 'this' is undefined
,
,
);
export default WorkspaceSlice;
我要做的是从addModule
中调用setActiveModule
,这样我就不会有重复的代码,但我收到一个错误,因为this
未定义。
有没有办法从另一个减速器中调用一个减速器?它的语法是什么?
如果没有,是否有可能以另一种方式实现此功能,假设我想将 addModule
和 setActiveModule
保留为单独的操作?
【问题讨论】:
【参考方案1】:从createSlice
返回的slice
对象包含您作为slice.caseReducers
传入的每个单独的case reducer 函数,以帮助解决此类情况。
所以,你可以这样做:
addModule(state, action)
const moduleName, renderingData = action.payload;
if (!state.modules[moduleName])
state.modules[moduleName] = renderingData;
WorkspacesSlice.caseReducers.setActiveModule(state, action);
,
此外,reducer 函数没有this
,因为不涉及类实例。它们只是函数。
【讨论】:
非常感谢!我不知道 caseReducers - 我尝试使用 .reducers,但正如预期的那样,它也不起作用。 如果使用它将我的减速器传递给 slice.reducers 会怎样? @Jesswin:不确定你在问什么——你能澄清一下吗?以上是关于是否可以使用 Redux Toolkit 从另一个 reducer 函数(在同一切片内)调用 reducer 函数?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 React 和 Redux 从另一个组件访问 ref?
Redux ToolKit:是不是可以在由 createAsyncThunk 创建的一个操作中调度来自同一切片的其他操作
关于 redux-toolkit redux-saga 的一些问题
如何使用 redux-toolkit 中的 createSlice 方法在不同的 reducer 函数中使用单个动作类型