om.next: как иметь несколько компонентов, использующих согласователь

Я новичок в om.next (и в clojurescript), и у меня есть следующий вопрос. Я могу только вызвать корневой компонент с помощью согласователя (т.е. вызвать его метод запроса); кажется, что каждый другой компонент должен вызываться с реквизитами и с om/factory. Я думаю, что я что-то упускаю.

Я пытаюсь создать приложение со списком задач (100 баллов за оригинальность!), с фильтром для отображения завершенных/незавершенных/всех элементов. Если мой компонент TodoList является корневым компонентом, я могу вызвать его запросом: [:todos] без проблем. Я хотел бы иметь другой корневой компонент, а также иметь компонент Filter, который проходит через согласователь.

Возможные варианты, которые я вижу:

  • иметь несколько om/add-root! вызовы (это не позволяет нам иметь вложенные компоненты, использующие согласователь, и это не тот шаблон, который я вижу в учебниках)

  • оберните все в глобальный компонент и передайте состояние через реквизиты. Но примеры делают чтение мультиметодом, который не стыкуется с этим подходом.

Это возможно? Благодарю вас!


person Robert Balicki    schedule 04.04.2016    source источник


Ответы (2)


Если вы еще этого не сделали, ознакомьтесь с Компоненты, идентификация и нормализация. · Вики omcljs/om · GitHub. В этом руководстве показано, как организовать многокомпонентное приложение под единым корнем, а также должно быть ясно, как read, mutate, Ident, IQuery и т. д. используются каждым отдельным компонентом для координации взаимодействия. с единственным и единственным состоянием приложения через средство согласования. Состояние приложения — это база данных приложения, использующая вложенные структуры данных внутри одной Карты.

Приложения React обычно имеют только один корневой компонент. Если корневых существует несколько, они обычно организованы по маршрутам, т. е. по одному корневому компоненту на каждый маршрут (см. также Компоненты React верхнего уровня — средний).

Также: Om/Next: The Reconciler — Medium

person Peer Reynders    schedule 04.04.2016

Концепция Om Next (и других, таких как reframe) заключается в том, что есть один источник истины — состояние вашего приложения. С Om Next пользовательский интерфейс вашего приложения состоит из одного (перевернутого) дерева компонентов. Во время рендеринга состояние вашего приложения загружается в ваш компонент Root с помощью Om Next, интерпретирующего его статический запрос. Это состояние приложения принимается как реквизит. Ваша задача — разобрать эти реквизиты и передать «вспомогательные реквизиты» остальной части дерева. Вы делаете это в методе render каждого из ваших компонентов.

Так что ваш второй вариант - путь. read связаны с ключевыми словами, которые находятся в ваших запросах статических компонентов. Если вы убедитесь, что ваше состояние находится в формате базы данных по умолчанию, то на самом деле каждый read может быть реализован одинаково, используя db->tree. Наличие глобального компонента и превращение каждого read в мультиметод — это несвязанные понятия, и поэтому они не являются несовместимыми. На самом деле наличие обоих довольно идиоматично.

Уже есть примеры приложений ToDo, которые вы можете посмотреть для справки: здесь и здесь.

Следует отметить, что ваш запрос компонента Root будет использовать соединения для включения других компонентов, поэтому ваш запрос [:todos] мне кажется неправильным. Что-то вроде [{:todos (om/get-query TodoList)}] было бы лучше :-)

person Chris Murphy    schedule 04.04.2016