0

我正在创建一个页面,该页面使用 om-boostrap 显示并编辑租户信息。(我知道 Clojure,但对 CLJS/Om/React/现代 Web 开发一般来说是新手。)显示和编辑租户信息之间的 UI 和功能是相似的——两者都可以使用输入字段;编辑只需要字段是“文本”而不​​是“静态”,并且需要“提交”和“取消”按钮。

我面临的问题是我无法弄清楚 React/Om 的方式来改变这样的组件。视图定义如下:

(defcomponent view [{:keys [id] :as app} owner]
  (render
   [_]
   (let [tenant (get @tenants id)]
     (dom/div
      (om/build header/header-view app)
      (dom/div {:class "h3"} "View Tenant\t"
               (utils/button {:on-click (fn []
                                          (om/update-state! owner
                                                            #(assoc app :edit? true))
                                          (om/refresh! owner))}
                             "Edit"))
      (om/build tenant-info {:edit? (:edit? app)
                             :tenant {:id id
                                      :name "Funny name"
                                      :unit-addr "Funny addr"
                                      :rent "Lots of rent"}})))))

我不会在tenant-view这里粘贴整个函数,但它使用 om-bootstrap 为每个租户数据字段构建 Bootstrap 输入:

. . .
(let [input-type (if edit? "text" "static")]
    (i/input {:ref "name-display"
              :type input-type
              :label "Tenant Name"
              :label-classname "col-xs-2"
              :wrapper-classname "col-xs-4"
              :value (str name)})
    . . .)

我尝试了多种方法。我发布了我最近的一次,使用按钮的:on-click功能来修改应用程序状态,将edit?属性设置为true并提示重新渲染以使输入可编辑。

这不起作用,我在 React 或 Om 文档中找不到指导。

  1. 以不同方式呈现相同组件的正确方法是什么?(在我的例子中,view函数的输入字段。)
  2. 什么 React 或 Om 文档是相关的?

更新:当我将edit?标志硬编码为 时,我可以使输入可编辑true,因此使输入可编辑不是问题:问题是从staticto切换text(反之亦然)。

4

2 回答 2

1

是的,问题与理解应用程序状态和组件状态之间的区别有关。在这种情况下,我们希望影响应用程序状态,我不太了解您的情况,但我认为为此使用组件本地状态会更好。您可以使用init-state:state。你可以随意使用om/update-state!。但是,只需添加到先前的答案,om/update!在您的场景中使用它来影响应用程序状态会更容易。

(utils/button {:on-click #(om/update! app [:edit?] true)}
                         "Edit")

是另一种选择,您可以让关键字向量尽可能深入到地图中。

这更简洁,但可能会导致 JS 控制台警告,因为我们忽略了eventfrom on-click

于 2016-08-24T14:00:54.030 回答
0

我认为问题在于您使用om/update-state!的是用于转换组件本地状态,而不是om/transact!用于更新传递给组件的道具。因此,尝试将您的按钮组件更改为:

(utils/button {:on-click (fn []
                             (om/transact! owner #(assoc app :edit true)))}
                             "Edit")
于 2015-12-20T10:49:10.873 回答