2014-06-28 11 views
8

Ich gehe durch diese OM tutorial, aber es ist mir nicht klar, wenn OM-Komponenten vs einfache Funktionen (insbesondere das om/Komponenten-Makro) zu verwenden.OM Components vs einfache Funktionen

Das Tutorial schreibt:

Das erste Argument ist eine Funktion, die die Anwendungszustandsdaten und der Träger, hier genannt Besitzer Reagieren Komponente nimmt. Diese Funktion muss eine Om Komponente zurückgeben - dh ein Modell des om/IRender Schnittstelle, wie om.core/Komponenten-Makro erzeugt

; 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"))}) 

Im nächsten Abschnitt werden wir das folgende Beispiel für eine Rendering-Schleife finden eine Liste:

; 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"))}) 

Hier sind wir Rückkehr im Grunde nur einen (virtuellen) dom direkt, nicht in einer OM-Komponente eingewickelt, so wäre die Frage: Warum wird die om/Komponenten-Makro existieren? Das Makro hilft uns einfach, die IRender-Funktion zu vereinheitlichen, aber es scheint, dass wir auch einfache Funktionen dafür verwenden können. Ich würde OM-Komponenten, die den Lifecycle-Status haben (oder den Besitzer get-props nennen), neu verfassen, aber für Komponenten, die nur virtual dom erzeugen müssen, würde ich eher einfache Funktionen verwenden (also brauche ich keine Build/Build- alle Funktionen um mein virtuelles Dom zu erstellen). Was fehlt mir hier? Warum ist das Makro immer noch nützlich (und ich sehe es nicht).

Antwort

9

ich letzte Woche diese gleiche Frage hatte, und ich gegraben durch die OM-Quellcode zu finden aus.

Ich konnte keinen funktionalen Unterschied zwischen der Verwendung des om/component Makro und nicht finden. Aber vielleicht kann diese Information etwas Licht auf jemanden werfen, der mehr über React weiß.

Jede Funktion f, die an om/root (und anschließend om/build) übergeben wurde, befindet sich in einer Om-Komponente eines Containers. Diese Om-Komponente ist nur eine Dummy-React-Komponente, die alle Lebenszyklusereignisse an das Ergebnis f weiterleitet, wenn sie die Lebenszyklusprotokolle von Om implementiert (d. H. Wenn es sich um ein reify-Objekt handelt).

Wenn das Ergebnis von f kein reify-Objekt ist, das diese Protokolle implementiert, wird davon ausgegangen, dass es sich um eine React-Komponente handelt, und es wird von der render-Lebenszyklusfunktion zurückgegeben.

(relevant: Om's render function here)

+1

Okay, dann verstehe ich es. Das Makro könnte also vorhanden sein, wenn Sie eine einfache reaktive Komponente in eine OM-Komponente einbinden möchten. Vielleicht haben zukünftige Versionen von OM eine etwas andere Semantik im om/Komponenten-Makro, so dass Sie das Makro besser verwenden, selbst wenn Sie nur eine reaktive Komponente zurückgeben müssen. – shaft

3

Die om/Komponente Makro ist nur eine Abkürzung für die defn und Kombination vergegenständlichen, wenn Sie in dem Zustand übergeben müssen

nicht
+3

dass ein Teil der Geschichte. Aus den Dokumenten, "Sugar über reify für das schnelle Zusammenstellen von Komponenten, die nur _ om.core/IRender implementieren müssen und keinen Zugriff auf das Eigentümer-Argument benötigen." – pdoherty926