为什么试剂不会在状态改变时重新渲染我的试剂形式

Kun*_*ngi 1 clojurescript reagent reagent-forms

我需要创建一个包含选择字段的表单,其中的选项取决于当前可用的邮件帐户。页面加载后,我在 API 请求中检索这些邮件帐户。

以下函数使用 select 元素创建表单。

(defn create-options [mail-accounts]
  (for [m mail-accounts]
    [:option {:key (keyword (str (:id m)))
              :value (:id m)}
     (:name m)]))

(defn render-mail-account-select [mail-accounts]
  (let [form-state (r/atom {})]
    (fn [mail-accounts]
      (let [form [:form.mailing-form.form-horizontal
                  (into [:select.form-control {:field :list :id :mail-account}]
                        (create-options mail-accounts))]]
        (pprint form)
        [bind-fields form form-state]))))
Run Code Online (Sandbox Code Playgroud)

pprint给了我以下输出:

;; Before the mail-accounts are loaded
[:select.form-control {:field :list, :id :mail-account}]

;; After the state update containing the mail accounts
[:select.form-control
 {:field :list, :id :mail-account}
 [:option {:key :24, :value 24} "First mail account name"]
 [:option {:key :25, :value 25} "Second mail account name"]]
Run Code Online (Sandbox Code Playgroud)

我的问题是我页面上的选择保持空白,就好像选择没有被重新渲染一样。

附录

我想我忘了添加一些代码:我将这个表单包装在一个 KIOO 组件中,在那里我取消了我的state原子的引用。

(defsnippet choose-account-panel "html/static-panel.html" [:div.panel]
  []
  {[:h4.panel-title] (content "3. Mail Account wählen")
   [:div.panel-body] (content [render-mail-account-select (:mail-accounts @state)])})
Run Code Online (Sandbox Code Playgroud)

这个组件然后调用我的render-mail-account-select函数并且应该正确地重新渲染表单。

Dan*_*ton 5

您需要为 Reagent 取消引用 Ratom 以了解当该 Ratom 更改时需要再次调用哪些函数。取消引用需要在 内部的匿名函数render-mail-account-select或它调用的函数之一中发生。我看不到这里发生任何取消引用?

有关Reagent 渲染的更多详细信息,请参阅此处的文档。