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

时间:2015-12-24 17:17:34

标签: javascript redux

我在jQuery应用程序中第一次使用Redux,并且我创建了一个小的可观察实现。 observable正在响应状态对象的多个属性的更改,在状态本身发生更改时对DOM进行更改。如果我的可观察回调需要2个属性值来完成它的任务,我将观察这两个值,然后使用这些值来更新UI。可观察者根本不接触国家。它们只是在回调中将它呈现给observable,因此可以用它来更新状态的UI。

我正在研究的项目是一个重构器,所以我在事后添加了Redux。有时,我意识到我需要一段代码中的特定状态属性,我可能没有时间正确地重构为一个可观察的。在这些情况下,我在商店打电话给getState以获得我需要的东西并继续使用它。我不禁觉得这种做法有点瑕疵。

使用store.getState我需要将它视为反模式吗?在使用store.getState时,我应该避免明确的用例吗?

1 个答案:

答案 0 :(得分:4)

如果过于宽松地使用store.getState(),最终会将全局状态传递给随机组件。您可能会在组件和状态的某些部分之间引入彼此无关的耦合,这是反模式的。您应该只调用getState有两个原因:获取应用的初始状态,以及商店的更新逻辑-i.e在store.subscribe()回调中。

就你的observable而言,在一个典型的基于组件的视图层(如React)中,你真正需要在redux应用程序中观察的唯一事情是整个应用程序状态作为一个整体,而不是它的各个部分。对整个州的更改将从顶级组件订阅并逐渐减少。

但是,由于您正在重构Jquery应用程序,我认为您对observable的使用是可以接受的。如果您不想自己动手,可以使用名为reselect的库来实现此目的。它可以帮助您从全局状态的任意部分计算状态,并提供有效的memoization,因此不会重新计算相同的输入。

  

有时,我意识到我需要一段代码中的特定状态属性,我可能没有时间正确地重构为可观察对象。在这些情况下,我在商店调用getState来获取我需要的东西并继续使用它。我不禁觉得这种做法有点瑕疵。

在这种情况下可以实现的一个简单的插入式解决方案是在reducers中使用事件发射器将全局状态的各个部分传播到需要它们的特定Jquery组件。这将使您不必传递全局状态,从而保留组件隔离。