Обновление вложенного состояния в Om.next
У меня проблемы с обновлением состояния данными из полей ввода в Om.next.
Состояние чтения в Om.next решается запросами, и запросы позволяют компонентам реализовывать выборку состояний независимо от контекста, что прекрасно, поскольку это означает, что компонент не должен знать структуру атома состояния, он просто должен понимать локальный фрагмент состояния атома, который имеет к нему непосредственное отношение.
К сожалению, я не смог определить способ сделать это в противоположном направлении, то есть мутировать состояние, основанное на взаимодействии пользователя с компонентами таким образом, чтобы это не связывало его с положением компонента в атоме состояния.
В большинстве примеров в Интернете есть функции мутации, которые изменяют определенный путь в атоме состояния, начиная с корня.
(defonce app-state (atom {:badge {:credentials {:user "" :password ""}}}))
Итак, теперь я иду, чтобы сделать компонент:
Object
(render [this]
(dom/div nil
(dom/input #js {:onChange ???
:value {:user value}})
(dom/input #js {:onChange ????
:value {:password value}})))
Это довольно грубый пример, но как мне обновить состояние, когда пользователь печатает, не привязываясь к тому факту, что оно хранится в пути [:badge :credentials]
?
Чтения ограничены запросом, но мутации - нет. Это простой надуманный пример, но он ухудшается, когда я пытаюсь визуализировать и обновить вложенное дерево с неизвестной формой (во время кодирования).
1 ответ
Ваш :onChange
может вызвать одну из ваших мутаций:
:onChange (fn [_] (om/transact! this `[(app/set-name { :person 1 :name ~n })]))
Помимо параметров и места, откуда вызывается мутация, здесь нет связи - мутация - только имя - здесь app/set-name
, Конечно, мутация должна быть реализована. Вот:
(defmethod m/mutate 'app/set-name
[{:keys [state] :as env} key {:keys [person name] :as params}]
{:action (fn []
(swap! state update-in [:people/by-id person] assoc :person/name name))})
Сам код мутации будет иметь дело с нормализованным состоянием приложения, что означает, что структурная форма данных не является деревом.
Этот пример был взят из: http: // localhost: 3449 / #! /Untangled_devguide.G_Mutation