В чем разница между состоянием приложения и локальным состоянием компонента в Clojurescript Om?

Я прошел базовый урок Дэвида Нолена по Om, но все еще немного озадачен разницей между состоянием приложения и локальным состоянием компонента. Когда упоминаются курсоры, относится ли это к одному или обоим из них тоже?

1 ответ

Решение

Как я понимаю:

Состояние приложения - это "глобальное" состояние, к которому все компоненты в дереве компонентов могут обращаться через курсоры. Это состояние, в котором находится ваше приложение и, в основном, то, что отображается Om. Так, например, если вы пишете программу чата, состояние приложения будет содержать список пользователей в разговоре и все отправленные сообщения или что-то еще.

Локальное состояние компонента - это состояние, локальное для одного компонента и не видимое за пределами этого компонента. Это устанавливается либо путем передачи {:init-state } для сборки, либо путем реализации IInitState и возврата карты из init-state - или обоих (в этом случае они соединяются вместе). Дэвид Нолэн рекомендует, чтобы локальное состояние использовалось только для переходного состояния, например, если мышь в данный момент нажата в компоненте перетаскивания и что все остальные состояния должны быть в состоянии приложения. То есть, если у вас есть виджет вкладки, текущая выбранная вкладка должна быть переведена в состояние приложения (а не в локальное состояние!), Но если вкладка перетаскивается в новое место, текущая позиция и состояние мыши будут (временно - пока операция перетаскивания не будет завершена) будет храниться в локальном состоянии компонента. Такие вещи, как каналы core.async, также могут храниться в локальном состоянии (хотя я также сохранил их (и видел, как другие делают то же самое) в общем состоянии и дополнительных данных - подробности об обоих см. Ниже)

Курсоры применяются только к состоянию приложения и похожи на окна в нем, так что компоненты, находящиеся далеко внизу дерева, могут получить доступ только к тем данным, к которым им фактически необходим доступ.

Доступ к состоянию приложения всегда осуществляется с помощью курсора (приложение в учебнике), а изменение состояния приложения выполняется с помощью курсора - оба параметра om / update! и ом / сделка! возьмите курсор в качестве первого аргумента. Вы также можете установить атом состояния приложения напрямую с помощью reset! и подкачайте!, но Дэвид рекомендует против этого, так как вы потеряете некоторые из более продвинутых функций Om (например, уведомление об изменениях).

Локальное состояние можно получить через IRenderState или напрямую, используя om/get-state. Вы можете установить локальное состояние с помощью om/set-state! и om/upate-state!. Все три из них принимают объект компонента поддержки (владелец в учебнике).

Существует также третий тип состояния в Om: общее состояние. Общее состояние передается в om/root с помощью параметра {:shared ...}, и к нему можно получить доступ из любого компонента в дереве под этим корнем, используя om / get-shared. Разница между этим и состоянием приложения заключается в том, что состояние приложения сужается посредством путей курсора, то есть подкомпоненты могут не иметь доступа ко всему состоянию приложения, в то время как общее состояние всегда доступно. Кроме того, изменение состояния приложения вызывает повторную визуализацию компонента, в то время как общее состояние не запускает визуализацию.

Кроме того, на самом деле существует и четвертый тип - вы можете передавать дополнительные данные компонентам через сборку, используя опцию {:opts ...}. Это данные, которые находятся за пределами жизненного цикла Om / реагировать, то есть неизменяемые данные, к которым вы можете получить доступ из компонента, но компонент никак не управляет ими. Это кажется наиболее полезным для данных конфигурации.

Другие вопросы по тегам