Clojurescript Om中的应用程序状态和组件本地状态有什么区别?

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

据我所知:

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

组件本地状态是单个组件本地的状态,不能在组件外部看到。 它通过传递{:init-state}来构build,或者通过实现IInitState并从init-state返回一个映射来设置(在这种情况下,它们被连接在一起)。 David Nolenbuild议本地状态只能用于临时状态,例如当前鼠标在拖放组件中被按下,而所有其他状态应为应用程序状态。 也就是说,如果你有一个标签小部件,当前select的标签应该设置为应用程序状态(不是本地状态!),但是如果标签被拖动到一个新的位置,当前位置和鼠标状态将是(临时 – 直到拖动操作完成)存储在组件本地状态。 像core.async频道的东西也可以存储在本地状态(虽然我也已经存储了它们(并看到别人也是这样做)在共享状态和额外的数据 – 详情见下文)

游标仅适用于应用程序状态,并且像窗口一样,使树下的组件只能访问实际需要访问的数据。

应用程序状态总是通过游标访问(本教程中的应用程序),并通过游标修改应用程序状态 – om / update! 和om /交易! 以一个光标作为他们的第一个参数。 您也可以直接设置应用程序状态primefaces重置! 和交换!,但大卫build议不要这样做,你失去了一些更先进的function(如被通知改变三angular洲)。

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

Om:共享状态还有第三种状态。 共享状态使用{:shared …}选项传递给om / root,可以使用om / get-shared从该根下的树中的任何组件访问。 这个和应用程序状态的不同之处在于应用程序状态通过游标path被缩小 – 也就是说,子组件可能无法访问整个应用程序状态 – 而共享状态总是可以访问的。 此外,修改应用程序状态会导致组件重新呈现,而共享状态不会触发呈现。

顺便说一句,实际上也有第四种types – 您可以使用{:opts …}选项通过构build将附加数据传递给组件。 这是生活在Om / react生命周期之外的数据 – 也就是说,它可以从组件访问的不可变数据,但组件不以任何方式pipe理它。 这对configuration数据似乎是最有用的。