在Om.next中更新嵌套状态
问题描述:
我在使用Om.next中的输入字段的数据更新状态时遇到问题。在Om.next中更新嵌套状态
在Om.next阅读状态通过查询解决,查询只是使组件来实现获取国家独立方面的,这是伟大的,因为这意味着该组件并不需要知道状态原子的结构,必须理解直接与之相关的州原子的局部片段。
不幸的是,我还没有能够确定一种方法来做到这一点在相反的方向,即基于用户与组件的交互作用来突变状态,而不是将它与状态原子中组件的位置耦合。
Web上的大多数示例都具有mutate功能,它们从根开始修改状态原子中的特定路径。
(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]
?
这些读取的范围是查询范围,但突变不是。这是一个简单的人为的例子,但是当我试图用(编码时)未知形状呈现和更新嵌套树时,情况变得更糟。
答
你: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))})
突变代码本身将处理标准化的应用程序状态,这意味着数据的结构,形状不是一棵树。