8

私はこのOM チュートリアルを進めていますが、OM コンポーネントと単純な関数 (特に om/component マクロ) をいつ使用するかが明確ではありません。

チュートリアルには次のように書かれています。

最初の引数は、アプリケーションの状態データとバッキング React コンポーネント (ここでは owner と呼ばれます) を取る関数です。この関数は Om コンポーネントを返す必要があります。つまり、om.core/component マクロが生成するような om/IRender インターフェイスのモデルです。

; 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 コンポーネントにラップされていません。このマクロは単に IRender 関数を具体化するのに役立ちますが、単純な関数をそのまま使用することもできるようです。ライフサイクル状態を持つ (または所有者が get-props を呼び出す必要がある) OM コンポーネントを具体化しますが、仮想 dom を作成する必要があるだけのコンポーネントの場合は、単純な関数を使用したいと思います (したがって、ビルド/ビルドは必要ありません)。私の仮想DOMを作成するためのすべての機能)。ここで何が欠けていますか?なぜマクロはまだ有用なのですか (そして私にはわかりません)。

4

2 に答える 2

9

先週も同じ質問があり、Om のソース コードを調べてみました。

om/componentマクロを使用する場合と使用しない場合の機能的な違いは見つかりませんでした。 しかし、この情報は、React について詳しい人に光を当てることができるかもしれません。

に渡された関数(およびその後fに渡された関数) は、コンテナー Om コンポーネントの内部に配置されます。この Om コンポーネントは、 Om のライフサイクル プロトコルを実装している場合 (つまり、reify オブジェクトの場合) にすべてのライフサイクル イベントを結果に転送する単なるダミーの React コンポーネントです。om/rootom/buildf

の結果がfそれらのプロトコルを実装する reify オブジェクトでない場合は、React コンポーネントであると見なされ、renderライフサイクル関数によって返される値として使用されます。

(関連: Om の render 関数はこちら)

于 2014-07-03T00:10:50.190 に答える
3

om/component マクロは、状態を渡す必要がない場合の defn と reify の組み合わせの省略形です。

于 2014-07-01T07:02:52.617 に答える