8

我正在阅读这个OM 教程,但我不清楚何时使用 OM 组件与普通函数(特别是 om/component 宏)。

教程写道:

第一个参数是一个接受应用程序状态数据和支持 React 组件的函数,这里称为 owner。此函数必须返回一个 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 的组件,我宁愿使用简单的功能(所以我不需要构建/构建-创建我的虚拟dom的所有功能)。我在这里想念什么?为什么宏仍然有用(我没有看到)。

4

2 回答 2

9

上周我也有同样的问题,我翻遍了 Om 源代码来找出答案。

我找不到使用om/component宏与不使用宏之间的任何功能差异。 但也许这些信息可以对更了解 React 的人有所启发。

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

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

(相关:这里 Om 的渲染函数

于 2014-07-03T00:10:50.190 回答
3

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

于 2014-07-01T07:02:52.617 回答