36

我已经阅读了 David Nolen 的基本 Om 教程,但我仍然对应用程序状态和组件本地状态之间的区别感到有些困惑。当提到游标时,它是指其中一个还是两个?

4

1 回答 1

70

据我了解:

应用程序状态是组件树中的所有组件都可以通过游标访问的“全局”状态。这是您的应用程序所处的状态,基本上是由 Om 呈现的状态。因此,例如,如果您正在编写一个聊天程序,应用程序状态将包含对话中的用户列表以及所有已发送的消息,或其他任何内容。

组件本地状态是单个组件本地的状态,并且在该组件之外无法看到。它可以通过传递 {:init-state } 来构建,或者通过实现 IInitState 并从 init-state 返回一个映射 - 或两者都设置(在这种情况下,它们是结合在一起的)。David Nolen 建议本地状态应该只用于瞬态状态,例如如果鼠标当前在拖放组件中被按下,并且所有其他状态应该是应用程序状态。也就是说,如果您有一个选项卡小部件,则当前选择的选项卡应设置为应用程序状态(不是本地状态!),但如果选项卡被拖动到新位置,当前位置和鼠标状态将是(暂时 -直到拖动操作完成)存储在组件本地状态。核心之类的东西。

游标仅适用于应用程序状态,并且就像进入其中的窗口,因此位于树下方的组件只能访问它们实际需要访问的数据。

应用程序状态总是通过游标访问(本教程中的app),修改应用程序状态是通过游标完成的——om/update!和 OM/交易!将游标作为他们的第一个参数。您也可以直接使用 reset 设置应用程序状态原子!和交换!,但大卫建议不要这样做,因为这样做你会失去 Om 的一些更高级的功能(比如被通知更改增量)。

本地状态可以通过 IRenderState 接收,也可以通过 om/get-state 直接访问。您可以使用 om/set-state 设置本地状态!和 om/upate-state!。所有这三个都采用组件支持对象(本教程中的所有者)。

Om 中还有第三种状态:共享状态。使用 {:shared ...} 选项将共享状态传递给 om/root,并且可以使用 om/get-shared 从该根目录下的树中的任何组件访问。这与应用程序状态之间的区别在于,应用程序状态通过游标路径缩小- 也就是说,子组件可能无法访问整个应用程序状态 - 而共享状态始终是可访问的。此外,修改应用程序状态会导致组件重新渲染,而共享状态不会触发渲染。

顺便说一句,实际上还有第四种类型 - 您可以使用 {:opts ...} 选项通过构建将附加数据传递给组件。这是存在于 Om/react 生命周期之外的数据——也就是说,您可以从组件访问它的不可变数据,但组件不会以任何方式管理它。这似乎对配置数据最有用。

于 2014-04-07T13:34:33.923 回答