Redux:这种全能的动作创作者模式错了吗



我是个新手。我不确定,使用下面的模式是错误的/愚蠢的吗?

import { createAction, handleActions } from "redux-actions";
const CHANGE_STATE = "appState/CHANGE_STATE";
export const changeState = createAction(CHANGE_STATE, (key, val) => ({ [key]: val }));
const initialState = {
maxBodySize: 1920,
isMaxBody: true,
isMobile: false
};
export default handleActions(
{
[CHANGE_STATE]: (state, { payload: changedState }) => {
const newState = {
...state,
...changedState
};
return newState;
}
},
initialState
);

每个状态只有一个可编辑的actionCreator。像这样:

// Can editable every state with 'changeState' action.
appState.changeState("isMaxBody", true);
appState.changeState("isMobile", true);
appState.changeState("maxBodySize", 960);

我可以继续使用这种方便的模式吗?

如果这个图案不好,请给我一些指示。

我能继续使用这种方便的模式吗

我不明白你为什么"不能"。从严格意义上讲,这似乎完全有效。

至于这是否是一个好主意,好吧,这是一个开放的意见,但我不建议使用这种模式。以下是几个原因:

  • 您失去了"操作"one_answers"状态修改"之间的抽象。很高兴能够说"执行此操作",而不必担心实际状态的变化。某些操作可能会修改状态的多个部分。所有这些都是从你身上抽象出来的,使它更加可控和可测试。同样,由于类似的原因,这可能不会很好地与中间件配合使用
  • 修改字符串属性"看起来很恶心",而且通常看起来很容易出错。如果您不小心在应用程序中的某个属性名称中输入了拼写错误,您将无法从工具中获得任何帮助
  • 与上面类似,您将失去利用静态类型(例如流或TypeScript(的任何能力。在团队中编写了一个相当大的React/Redux应用程序后,我强烈建议使用TypeScript之类的应用程序,而这种模式在强/静态类型的应用程序中不会很好地工作

这些是我的观点,源于我的经验。如果这个模式对你和你正在努力实现的目标都很好,你可能会发现它很好。

附言:如果你要使用这样的模式,我不明白你为什么不只做appState.changeState({isMaxBody: true});而不是appState.changeState("isMaxBody", true);。它看起来有点干净,至少更接近于允许更好的打字。

最新更新