我已经阅读了David Nolen的基本Om教程,但我仍然对应用程序状态和组件本地状态之间的区别感到困惑。当提到游标时,它也指的是其中一个或两个?
答案 0 :(得分:70)
据我所知:
应用程序状态是组件树中的所有组件都可以通过游标访问的“全局”状态。这是您的应用程序所处的状态,基本上是Om呈现的状态。因此,例如,如果您正在编写聊天程序,则应用程序状态将包含对话中的用户列表以及已发送的所有消息,或其他任何内容。
组件本地状态是单个组件的本地状态,在此组件外部无法看到。它可以通过传递{:init-state}来构建,也可以通过实现IInitState并从init-state返回一个映射来设置 - 或者两者兼而有之(在这种情况下,它们是联合在一起的)。 David Nolen建议本地状态仅应用于瞬态,例如,如果鼠标当前在拖放组件中被按下,并且所有其他状态应该是应用程序状态。也就是说,如果您有一个选项卡小部件,则应将当前选定的选项卡设置为应用程序状态(而不是本地状态!),但如果将选项卡拖动到新位置,则当前位置和鼠标状态将是(暂时 - 直到拖动操作完成)存储在组件本地状态。像core.async频道这样的东西也可以存储在本地状态(虽然我也在共享状态和其他数据中存储它们(并且看到其他人也这样做) - 有关两者的详细信息,请参见下文)
游标仅适用于应用程序状态,并且类似于窗口,因此远离树的组件只能访问它们实际需要访问的数据。
始终通过游标(教程中的 app )访问应用程序状态,并通过游标修改应用程序状态 - om / update!和om / transact!把光标作为他们的第一个参数。您也可以直接使用reset设置应用程序状态原子!和交换!,但是大卫建议不要这样做,因为这样做会让你失去Om的一些更高级的功能(比如收到改变增量的通知)。
可以通过IRenderState接收本地状态,也可以使用om / get-state直接访问本地状态。您可以使用om / set-state设置本地状态!和om / upate-state!。所有这三个都采用组件支持对象(教程中的所有者)。
Om中还有第三种状态:共享状态。使用{:shared ...}选项将共享状态传递给om / root,并且可以使用om / get-shared从该根下的树中的任何组件访问。此应用程序状态与应用程序状态之间的区别在于应用程序状态通过游标路径缩小 - 也就是说,子组件可能无法访问整个应用程序状态 - 而共享状态始终可访问。此外,修改应用程序状态会导致重新呈现组件,而共享状态不会触发渲染。
另外,实际上还有第四种类型 - 您可以使用{:opts ...}选项通过构建将其他数据传递给组件。这是存在于Om / react生命周期之外的数据 - 也就是说,它可以从组件访问它的不可变数据,但组件不以任何方式管理它。这似乎对配置数据最有用。