2014-06-28 16 views
8

Przechodzę przez to OM tutorial, ale nie jest dla mnie jasne, kiedy używać komponentów OM w porównaniu do funkcji prostych (w szczególności makro om/komponent).Komponenty OM vs funkcje proste

Tutorial pisze:

Pierwszy argument to funkcja, która pobiera dane stanu aplikacji i podkład React komponentu, o nazwie właściciela. Funkcja ta musi powrotu składnik Om - czyli modelu interfejsu om/IRender, jak om.core/części makro generuje

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

W kolejnym rozdziale wybrać następujący przykład pętli renderowania na liście:

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

Tutaj, mamy w zasadzie tylko przekazujących (wirtualny) DOM bezpośrednio nie zawinięty w komponencie OM, więc pytanie byłoby: Dlaczego makro om/komponent istnieje? Makro po prostu pomaga nam w reifikacji funkcji IRender, ale wydaje się, że możemy po prostu użyć do tego zwykłych funkcji. Chciałbym rektyfikować komponenty OM, które mają stan cyklu życia (lub potrzebują właściciela, aby wywoływać get-props), ale komponenty, które potrzebują tylko stworzyć wirtualną domenę Wolę używać prostych funkcji (więc nie potrzebuję kompilacji/kompilacji) wszystkie funkcje do tworzenia mojej wirtualnej domeny). Czego tu mi brakuje? Dlaczego makro jest nadal przydatne (i nie widzę tego).

Odpowiedz

9

miałem to samo pytanie w ubiegłym tygodniu, a ja wykopał za pośrednictwem kodu źródłowego Om znaleźć na zewnątrz.

Nie mogłem znaleźć żadnej funkcjonalnej różnicy między używaniem makra om/component, a nie. Ale może ta informacja może rzucić trochę światła na kogoś, kto wie więcej na temat React.

Dowolna funkcja f przekazana do om/root (a następnie om/build) zostaje umieszczona wewnątrz kontenera Om-komponentu. Ten komponent Om jest po prostu sztucznym komponentem React, który przekazuje wszystkie zdarzenia cyklu życia do wyniku f, jeśli implementuje protokoły cyklu życia Om (to znaczy, gdy jest obiektem reifikacji).

Jeśli wynik f nie jest obiektem reify, który implementuje te protokoły, przyjmuje się, że jest składnikiem React i jest używany jako wartość zwracana przez funkcję cyklu życia render.

(dotyczy: Om's render function here)

+1

Dobra, to rozumiem. Więc makro może być tam, kiedy chcesz zawinąć prosty składnik reakcji w komponent OM. Być może przyszłe wersje OM będą mieć nieznacznie różne semantyki w makrze om/component, więc lepiej użyć makra, nawet wszystko, co musisz zrobić, to zwrócić komponent reagowania. – shaft

3

OM/składnik makro jest po prostu skrótem dla defn i zreifikować kombinację kiedy nie trzeba przechodzić w stan

+3

To część historii. Z dokumentacji "Sugar over reify do szybkiego składania składników, które _only potrzebują do implementacji_op.core/IRender i nie potrzebują dostępu do argumentu właściciela." – pdoherty926