Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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