Asa*_*ner 7 javascript reactjs redux react-redux redux-toolkit
我有这个小模块管理片:
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;
Run Code Online (Sandbox Code Playgroud)
我想要做的是setActiveModule从内部调用,addModule这样我就不会有重复的代码,但我收到一个错误,因为this未定义。
有没有办法从另一个内部调用一个减速器?那的语法是什么?
如果没有,是否有可能以另一种方式实现此功能,假设我想同时保留addModule和setActiveModule作为单独的操作?
mar*_*son 10
slice从返回的对象createSlice包括您传入的每个单独的 case reducer 函数slice.caseReducers,以帮助处理此类情况。
所以,你可以这样做:
addModule(state, action) {
const { moduleName, renderingData } = action.payload;
if (!state.modules[moduleName]) {
state.modules[moduleName] = renderingData;
}
WorkspacesSlice.caseReducers.setActiveModule(state, action);
},
Run Code Online (Sandbox Code Playgroud)
此外,reducer 函数没有this,因为不涉及类实例。它们只是函数。
小智 5
Redux Toolkit 文档有一个示例\xef\xbc\x8c,您可以阅读如何操作:
\nconst slice = createSlice({\n name: \'test\',\n initialState: 0,\n reducers: {\n increment: (state, action: PayloadAction<number>) => state + action.payload,\n },\n})\n\n// also available:\nslice.caseReducers.increment(0, { type: \'increment\', payload: 5 })\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2078 次 |
| 最近记录: |