首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更新Om.next中的嵌套状态

更新Om.next中的嵌套状态
EN

Stack Overflow用户
提问于 2016-11-28 05:49:00
回答 1查看 177关注 0票数 0

我在用Om.next中输入字段的数据更新状态时遇到了问题。

读取Om.next中的状态是通过查询来解决的,查询使组件能够独立于上下文实现获取状态,这很棒,因为这意味着组件不需要知道状态原子的结构,它只需要了解与其直接相关的状态原子的本地片段。

不幸的是,我还没能在相反的方向上确定这样做的方法,即基于用户与组件的交互以一种不将其与组件在状态原子中的位置耦合的方式来改变状态。

web上的大多数示例都具有从根开始修改状态原子中的特定路径的变异函数。

代码语言:javascript
运行
复制
(defonce app-state (atom {:badge {:credentials {:user "" :password ""}}}))

所以现在我要渲染这个组件:

代码语言:javascript
运行
复制
Object
(render [this]
(dom/div nil
       (dom/input #js {:onChange ???
                       :value {:user value}})
       (dom/input #js {:onChange ????
                       :value {:password value}})))

这是一个相当粗糙的示例,但是我如何在用户输入时更新状态,而不考虑它存储在路径[:badge :credentials]下的事实?

读取由查询限定作用域,但突变不是。这是一个简单的人为设计的例子,但当我试图渲染和更新嵌套的树(在编码时)形状未知时,情况会变得更糟。

EN

回答 1

Stack Overflow用户

发布于 2016-11-28 07:26:42

你的:onChange可能会触发你的一个突变:

代码语言:javascript
运行
复制
:onChange (fn [_] (om/transact! this `[(app/set-name { :person 1 :name ~n })]))

除了参数和调用突变的地方,这里没有耦合-突变只是一个名字-在这里app/set-name。当然,变异是必须实现的。这就是它:

代码语言:javascript
运行
复制
(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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40834319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档