2016-06-20 5 views
1

Поскольку я только начинаю полностью понимать, заводские функции om.core/build и om.next возвращают объекты элементов реакции, которые относятся к функциям/классам компонентов и the actual component is only instantiated later by React's reconciler. То есть, (om.core/build some-component data) фактически не вызывает some-component.Должны ли вызываться «компоненты» в Om?

Однако мы часто представляем простые «без гражданства» компоненты как просто функции, которые принимают реквизит и возвращают элемент React. В мире (чистый) React вы использовали бы одну из этих функций, например, класс компонентов, как React.createElement(AStatelessComponent, {some: "props"}), или более удобно в JSX как <AStatelessComponent some="props" />. Они также возвращают элемент React, который ссылается на AStatelessComponent, который на самом деле не будет вызван до конца.

Но в Om, когда у нас есть простой компонент, подобный этому (и, по крайней мере, мы «я», я имею в виду меня и свою команду), мы вызываем функцию напрямую. Таким образом,

(render [this] 
    (om/div {} 
     (a-stateless-component {:some "data"}))) 

Здесь a-stateless-componentэто вызывается сразу, и все, что она возвращает вставляется непосредственно в DIV, а не замещено позже в React выверке.

Есть ли предпочтительный способ для React.createElement в Ом? Или предпочтительнее просто вызывать такие функции напрямую, даже если он пропускает создание экземпляра компонента в дереве рендеринга?

ответ

0

В Om, если вы хотите создать экземпляр компонента без гражданства, вам необходимо напрямую позвонить js/React.createElement.

Почему вы хотели бы сделать это зависит:

  1. если вы звоните React.createElement вы получаете «гусеничный» экземпляр в РЕАКТЕ выверки
  2. , если вы этого не сделаете, вы получите встраивание, но без гражданства компонент в настоящее время нельзя отличить от родителя в дереве рендеринга React.

EDIT: Я только понял, что om.next/factory достаточно разрешительный, чтобы он позволял создавать экземпляры компонентов без гражданства, о которых вы говорили. Таким образом, вы можете добиться того, что хотите, и вызвав js/React.createElement непосредственно на функцию реквизита, либо вызвав om.next/factory с той же функцией, что и аргумент.

Вот рабочий пример. Следующий код:

((om/factory #(dom/div nil "Hello, World"))) 

приводит к следующему компоненту (в РЕАКТ Devtools):

stateless component

Смежные вопросы