OM组件与普通功能

时间:2014-06-28 11:39:15

标签: clojurescript om

我正在浏览这个OM tutorial,但我不清楚何时使用OM组件与普通函数(特别是om /组件宏)。

教程写道:

  

第一个参数是一个获取应用程序状态数据的函数   和后台React组件,这里称为所有者。这个功能必须   返回一个Om组件 - 即om / IRender接口的模型,   像om.core / component宏生成

; here the function (fn [app owner]) indeed returns an OM component
(om/root
  (fn [app owner]
    (om/component (dom/h2 nil (:text app))))
  app-state
  {:target (. js/document (getElementById "app"))})

在下一节中,我们找到以下列表的渲染循环示例:

 ; this one does not return an om component (or does it?). it returns a virtual dom
(om/root
  (fn [app owner]
    (apply dom/ul nil
      (map (fn [text] (dom/li nil text)) (:list app))))
  app-state
  {:target (. js/document (getElementById "app0"))})

在这里,我们基本上只是直接返回一个(虚拟)dom,而不是包含在OM组件中,所以问题是:为什么om / component宏存在?宏只是帮助我们验证IRender功能,但看起来我们也可以只使用普通函数。我会重新定义具有生命周期状态的OM组件(或者需要所有者调用get-props)但是对于只需要创建虚拟dom的组件我宁愿选择简单的功能(所以我不需要build / build-all函数来创建我的虚拟dom)。我在这里错过了什么?为什么宏仍然有用(我也看不到它)。

2 个答案:

答案 0 :(得分:9)

我上周遇到了同样的问题,我挖掘了Om源代码以找出答案。

我无法找到使用om/component宏之间的任何功能差异。但也许这些信息可以揭示更多了解React的人。

传递给f(以及随后的om/root)的任何函数om/build都放在容器Om组件内。这个Om组件只是一个虚拟的React组件,如果它实现了Om的生命周期协议(即它是一个reify对象),它会将所有生命周期事件转发到f的结果。

如果f的结果不是实现这些协议的reify对象,则假定它是React组件,并且它被用作render生命周期函数返回的值。 / p>

(相关:Om's render function here

答案 1 :(得分:3)

当你不需要传入状态时,om / component宏只是defn和reify组合的简写