如何使用 redux 工具包动态生成 reducer 和 action 类型?
How to dynamically generate reducers and action types with redux toolkit?
我正在从使用普通 redux 过渡到使用 redux 工具包,但我有以下无法过渡的场景:
纯 Redux:
const openEntityScreen = (payload: any) => {
var { module, entity, operation } = payload;
return {
type: `entityScreen/${module}/${entity}/${operation}/open`
}
}
那我有一个reducer creator..
export default function (module, entity, operation, initialState) {
return (state, action) => {
switch (action.type) {
case `entityScreen/${module}/${entity}/${operation}/open`: {
...
return {
...state,
...
}
default: return state
}
}
}
我这样注册的:
var someEntityScreenReducer = createEntityScreenReducer(
'someModuleName',
'someEntityName',
'someOperationName',
someState
);
然后将此reducer分配给负责'someModuleName'、'someEntityName'等状态的某个部分
基本上这样我就可以为不同的模块和实体等快速创建多个减速器
因此,当尝试使用 redux 工具包转换此逻辑时,存在 2 个主要问题:
1.我无法使用操作的有效负载动态构建操作的类型。
例如,当使用诸如 createAction('counter/increment') 之类的 createAction 方法时,我们需要显式传递类型,即使我们使用 payload prepare 回调,我们仍然无法动态构建操作的类型。
2。无法创建减速器 cases/actions。动态
在上面的示例中,我们使用传递的 reducer creator 参数构建案例。我无法使用 createReducer 函数实现此目的,因为我们使用预构建操作来映射或使用构建器创建案例,而且我也无法使用 createSlice 实现此目的,因为在那儿 cases/actions 是自动创建的,不是动态创建的。
老实说,这听起来好像您只是将所有组件本地 UI 状态放入 Redux,我们通常建议不要这样做。 https://redux.js.org/style-guide/style-guide/#evaluate-where-each-piece-of-state-should-live
在大多数情况下,Redux 切片彼此截然不同。
如果它们与您描述的一样相似,您可能还可以使用一个 reducer 将所有数据保存为标准化形状。
综上所述,当然你可以创建高阶函数来随意创建切片。在文档中有一个例子,它创建了一个基本的切片,上面有额外的东西:https://redux-toolkit.js.org/usage/usage-with-typescript#wrapping-createslice
我正在从使用普通 redux 过渡到使用 redux 工具包,但我有以下无法过渡的场景:
纯 Redux:
const openEntityScreen = (payload: any) => {
var { module, entity, operation } = payload;
return {
type: `entityScreen/${module}/${entity}/${operation}/open`
}
}
那我有一个reducer creator..
export default function (module, entity, operation, initialState) {
return (state, action) => {
switch (action.type) {
case `entityScreen/${module}/${entity}/${operation}/open`: {
...
return {
...state,
...
}
default: return state
}
}
}
我这样注册的:
var someEntityScreenReducer = createEntityScreenReducer(
'someModuleName',
'someEntityName',
'someOperationName',
someState
);
然后将此reducer分配给负责'someModuleName'、'someEntityName'等状态的某个部分
基本上这样我就可以为不同的模块和实体等快速创建多个减速器
因此,当尝试使用 redux 工具包转换此逻辑时,存在 2 个主要问题:
1.我无法使用操作的有效负载动态构建操作的类型。
例如,当使用诸如 createAction('counter/increment') 之类的 createAction 方法时,我们需要显式传递类型,即使我们使用 payload prepare 回调,我们仍然无法动态构建操作的类型。
2。无法创建减速器 cases/actions。动态
在上面的示例中,我们使用传递的 reducer creator 参数构建案例。我无法使用 createReducer 函数实现此目的,因为我们使用预构建操作来映射或使用构建器创建案例,而且我也无法使用 createSlice 实现此目的,因为在那儿 cases/actions 是自动创建的,不是动态创建的。
老实说,这听起来好像您只是将所有组件本地 UI 状态放入 Redux,我们通常建议不要这样做。 https://redux.js.org/style-guide/style-guide/#evaluate-where-each-piece-of-state-should-live
在大多数情况下,Redux 切片彼此截然不同。 如果它们与您描述的一样相似,您可能还可以使用一个 reducer 将所有数据保存为标准化形状。
综上所述,当然你可以创建高阶函数来随意创建切片。在文档中有一个例子,它创建了一个基本的切片,上面有额外的东西:https://redux-toolkit.js.org/usage/usage-with-typescript#wrapping-createslice