在Redux中使用getState是一种反模式吗?

7
我第一次在jQuery应用程序中使用Redux,创建了小的observable实现。观察器对状态对象的多个属性进行响应,当状态本身发生变化时,它们会更改DOM。如果我的observable回调需要两个属性值来完成其任务,我将观察这两个值,然后使用这些值来更新UI。观察器根本不会触及状态。它们只是把它呈现给observable在回调中使用,以便可以使用状态来更新UI。
我正在进行的项目是重构,因此我事后添加了Redux。有时,我意识到我需要一个特定的状态属性在一段代码中,而我可能没有时间将其正确地重构为observable。在这些情况下,我调用store的getState来获取所需内容并继续进行。我不能帮助感觉这种方法有些有缺陷。
无论何时我需要它,使用store.getState被视为反模式吗?在使用store.getState时应避免的明确用例是什么?
1个回答

4
当您过于自由地使用store.getState()时,您最终会将全局状态传递给随机组件。您有可能在组件和与其无关的状态部分之间引入耦合,这是反模式。您只应该调用getState有两个原因:获取应用程序的初始状态和在存储器更新逻辑中 -即在store.subscribe()回调内部。

就你的可观察对象而言,在诸如React之类的典型组件化视图层中,您真正需要观察的是整个应用程序状态作为一个整体,而不是其中的单个部分。对整个状态的更改被订阅并从顶级组件向下传递。

但是,由于您正在重构Jquery应用程序,我认为您对可观察对象的使用是可以接受的。如果您不想自己编写代码,可以使用名为reselect的库来实现此目的。它帮助您从全局状态的任意部分计算状态,并提供有效的记忆功能,以便不会重新计算相同的输入。

有时候,我意识到在代码中需要一个特定的状态属性,但可能没有时间将其适当地重构为可观察对象。在这种情况下,我调用存储器上的getState来获取所需内容,并继续进行。我无法帮助感到这种方法有点有缺陷。
在这种情况下,您可以实现一种简单的替代方案,即在您的reducer中使用事件发射器来传播全局状态的部分信息给需要它们的特定Jquery组件。这样可以避免传递全局状态,保留组件隔离性。

我正在使用reducer来响应操作更新状态。我的observables唯一对状态更改做出的反应是更新DOM。考虑到这不是一个React应用程序,如果没有observable,我还能用什么方式来更新UI呢? - Spencer Carnage
好的,我明白你的问题了。你的UI没有与redux容器状态连接。在这种情况下,我可能会使用事件发射器将特定的状态片段(当它们改变时)广播到需要它们的jQuery组件 - 每当你的reducers转换一个状态片段时,已注册事件的组件可以对DOM进行必要的更改。你将避免传递全局状态并提高组件隔离性。 - Anchor
就你使用可观察对象来计算状态而言,我认为这是可以的。然而,有一个名为 reselect 的库非常适合这种用例,并且可以对输入进行记忆化处理,强烈推荐使用。 - Anchor
我的可观察对象是 Redux 和我的应用程序之间的连接,听起来我在使用它们方面走上了正确的道路。问题在于我在可观察对象外部使用了 store.getState,这正是我预料到的问题。我已经更新了我的问题以尝试澄清任何混淆。如果您想根据我们的讨论更新您的答案,我将非常乐意接受。谢谢! - Spencer Carnage
根据我们的讨论更新了答案!如果有任何不清楚的地方,请告诉我。 - Anchor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接