om.next: как иметь несколько компонентов, которые используют примиритель
Я новичок в om.next (и в clojurescript), и у меня есть следующий вопрос. Я могу получить только корневой компонент, который будет вызываться с помощью реконсилера (т.е. вызывать его метод запроса); каждый другой компонент, кажется, должен вызываться с помощью реквизита и om/factory
, Я думаю, что что-то упустил.
Я пытаюсь создать приложение со списком задач (100 баллов за оригинальность!) С фильтром для отображения завершенных / неполных / всех элементов. Если мой TodoList
компонент является корневым компонентом, я могу вызвать его с помощью запроса: [:todos]
без проблем. Я хотел бы иметь другой корневой компонент, а также иметь Filter
Компонент, который проходит через согласователь.
Возможные варианты я вижу:
есть несколько ом / add-root! вызовы (это препятствует тому, чтобы у нас были вложенные компоненты, которые используют согласователь, и это не тот шаблон, который я вижу в руководствах)
обернуть все в глобальный компонент и передать состояние через реквизит. Но примеры делают чтение мультиметодом, который не совместим с таким подходом.
Это возможно? Спасибо!
2 ответа
Концепция Om Next (и других, таких как reframe) заключается в том, что существует один источник правды - состояние вашего приложения. С Om Next пользовательский интерфейс вашего приложения состоит из одного (перевернутого) дерева компонентов. Во время рендеринга ваше приложение загружается в ваш Root
Компонент по Om Далее интерпретируем его статический запрос. Это состояние приложения принимается как "реквизит". Ваша задача - разложить эти подпорки и передать "подпорки" вниз по дереву. Вы делаете это в render
метод каждого из ваших компонентов.
Таким образом, ваш второй вариант - это путь. read
Они связаны с ключевыми словами, которые находятся в ваших запросах статического компонента. Если вы убедитесь, что ваше состояние в формате DB по умолчанию, то на самом деле каждый read
может быть реализован таким же образом, используя db->tree
, Наличие глобального компонента и создание каждого read
мультиметоды являются несвязанными понятиями и, следовательно, не являются несовместимыми. На самом деле наличие обоих довольно идиоматично.
Уже есть примеры приложений ToDo, которые вы можете посмотреть для справки: здесь и здесь.
Стоит отметить, что ваш Root
запрос компонента будет использовать соединения для включения других компонентов, поэтому ваш запрос [:todos]
не выглядит правильным для меня. Что-то вроде [{:todos (om/get-query TodoList)}]
было бы лучше:-)
Если вы еще этого не сделали, посмотрите на Компоненты, Идентичность и Нормализацию · omcljs / om Wiki · GitHub. Из этого туториала Вы узнаете, как организовать многокомпонентное приложение под одним рутом, а также должно быть ясно read
, mutate
, Ident
, IQuery
и т. д. используются каждым отдельным компонентом для координации взаимодействия с состоянием единственного приложения через посредник. Состояние приложения - это, в основном, база данных приложения, использующая вложенные структуры данных внутри одной карты.
Приложения React обычно имеют только один корневой компонент - если есть несколько корней, они обычно организованы по маршрутам, то есть по одному корню на маршрут (см. Также Компоненты реагирования верхнего уровня - Средний).