- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经阅读了 David Nolen 的基本 Om 教程,但我仍然对应用程序状态和组件本地状态之间的区别感到有些困惑。当引用游标时,它是否也引用了其中之一或两者?
最佳答案
据我了解:
应用程序状态是组件树中的所有组件都可以通过游标访问的“全局”状态。这是您的应用程序所处的状态,基本上是 Om 呈现的状态。因此,例如,如果您正在编写聊天程序,应用程序状态将包含对话中的用户列表和所有已发送的消息,或其他内容。
组件本地状态是单个组件本地的状态,在该组件之外无法看到。它可以通过传递 {:init-state } 来构建,或者通过实现 IInitState 并从 init-state 返回一个映射来设置 - 或者两者兼而有之(在这种情况下,它们被组合在一起)。 David Nolen 建议本地状态应该只用于 transient ,例如当前在拖放组件中按下鼠标,而所有其他状态都应该是应用程序状态。也就是说,如果你有一个选项卡小部件,当前选择的选项卡应该设置在应用程序状态(不是本地状态!),但是如果选项卡被拖到一个新位置,当前位置和鼠标状态将是(暂时 -直到拖动操作完成)存储在组件本地状态。 core.async channel 之类的东西也可以存储在本地状态中(尽管我也将它们(并且看到其他人也这样做)存储在共享状态和附加数据中 - 有关两者的详细信息,请参见下文)
游标仅适用于应用程序状态,就像进入其中的窗口一样,因此树下的组件只能访问它们实际需要访问的数据。
应用程序状态总是通过游标(教程中的应用程序)访问,修改应用程序状态是通过游标完成的 - om/update!和 om/交易!将游标作为他们的第一个参数。你也可以直接用reset设置应用状态atom!和交换!,但大卫建议不要这样做,因为这样做你会失去一些 Om 更高级的功能(比如收到更改增量通知)。
本地状态可以通过 IRenderState 接收,也可以通过 om/get-state 直接访问。您可以使用 om/set-state 设置本地状态!和 om/upate-state!。所有这三个都需要一个组件支持对象(教程中的所有者)。
Om 中还有第三种状态:共享状态。共享状态使用 {:shared ...} 选项传递给 om/root,并且可以使用 om/get-shared 从该根下树中的任何组件访问。这与应用程序状态的区别在于,应用程序状态是通过光标路径缩小的——也就是说,子组件可能无法访问整个应用程序状态——而共享状态始终是可访问的。此外,修改应用程序状态会导致组件重新渲染,而共享状态不会触发渲染。
顺便说一句,实际上还有第四种类型 - 您可以使用 {:opts ...} 选项通过构建将附加数据传递给组件。这是存在于 Om/react 生命周期之外的数据——也就是说,您可以从组件访问它的不可变数据,但组件不会以任何方式管理它。这似乎对配置数据最有用。
关于clojurescript - Clojurescript Om 中的应用程序状态和组件本地状态有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22883759/
如何从 clojurescript 程序中获取我所在的 Clojurescript 命名空间?我想这样做确实提供了某些调试信息(它只需要在开发模式下工作) 最佳答案 命名空间在 ClojureScri
我正在考虑使用 ClojureScript 构建一个网站。在客户端和服务器端都编写 ClojureScript 是否有意义,就像 node.js 一样? 最佳答案 这是可能的,但绝对没有理由不在服务器
我正在与Om合作,但我不完全理解以下表达式: (.. e -target -checked) 在这里,“ e”是一个JavaScript事件,“-target -checked”是一种访问属性的方式
我想在 ClojureScript 中前向声明一个函数。种 (defn a [] (b)) ... (defn b [] ...) 我觉得在用法(b)前面放一个(def b nil)是个什么样的作品,
我想在 ClojureScript 中前向声明一个函数。种 (defn a [] (b)) ... (defn b [] ...) 我觉得在用法(b)前面放一个(def b nil)是个什么样的作品,
我不知道像 this 这样的“自托管”clojurescript 实现如何和 this被实现。 但是,鉴于 clojurescript 编译器是用 clojure 编写的并将 clojure 编译为
考虑以下假设的无意义的 ClojureScript 函数: (defn tmp [] (def p 0) (set! p (inc p)) (set! p (inc p)) (set!
我在生产构建部分遇到问题 ClojureScript quickstart .具体来说,当我运行时:java -cp "cljs.jar;src" clojure.main release.clj我得
我正在尝试使用 defmacro在 ClojureScript 中,但出现控制台错误: TypeError: 'undefined' is not an object (evaluating 'crd
我正在寻找一种在 clojureScript 中根据字符串名称调用函数的方法。 就像是: (call "my-fun" args) 欢迎任何帮助 最佳答案 一个应该有效的非常hackish的解决方案:
在 Ubuntu 10.04.1 LTS 上的 FireFox 5.0 中运行的 ClojureScript 程序中,当抛出异常时,我得到一条神秘的线。 '错误:没有为类型对象定义协议(protoco
我正在努力工作 FormidableLabs/radium · GitHub与 reagent-project/reagent · GitHub ,但我已经走到了死胡同。 我能够通过“破解”试剂功能使
是否可以将 Google Closure Templates 与 Clojurescript 一起使用? 我环顾四周,但没有找到任何有关此的信息。 最佳答案 由于 Soy 模板已编译为 JavaScr
我想从 clojurescript 设置 element.style.height 属性,但不幸的是这段代码失败了: (set! (-> (sel1 tr :.ragslide) .-style .-
我正在使用 ClojureScript 编写一些原子(编辑器)包。我遇到了依赖加载问题。 编译后的 ClojureScript 生成如下文件 (main.js): goog.addDependency
我正在为 clojurescript 库编写一些 cljs.test 测试,并且有一些我想加载的 JSON 测试数据。 我不确定我可以使用什么函数来从项目的本地文件加载数据。 我正在使用 lein-d
我有一个从 Leiningen 启动的 ClojureScript 应用程序。我如何在应用程序启动时将环境变量传递给应用程序(可能是它构建时) 最佳答案 有两个构建时间选项: 使用宏 CLJS 宏是
如何在 ClojureScript 中获取时间戳,类似于 Unix 的时间戳,即表示当前时间和日期的单个数字,作为数字。我知道: if (!Date.now) { Date.now = fun
我需要使用 ClojureScript 打开一个新选项卡。 (js/window.open "http://localhost/go/somewhere") 我收到以下错误:未捕获类型错误:windo
我已经阅读了 David Nolen 的基本 Om 教程,但我仍然对应用程序状态和组件本地状态之间的区别感到有些困惑。当引用游标时,它是否也引用了其中之一或两者? 最佳答案 据我了解: 应用程序状态是
我是一名优秀的程序员,十分优秀!