【问题标题】:Why does reagent not re-render my reagent-form on a state change为什么试剂不会在状态更改时重新呈现我的试剂表格
【发布时间】:2016-01-21 13:10:25
【问题描述】:

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

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

(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]))))

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"]]

我的问题是我页面上的选择保持为空,好像选择没有重新呈现一样。

附录

我想我忘了添加一些代码: 我将此表单包装在一个 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)])})

该组件然后调用我的render-mail-account-select 函数并应正确重新呈现表单。

【问题讨论】:

  • (免责声明:我不知道我在说什么)您在 let 绑定中对一个新的试剂原子进行了闭包,但是如何更新该原子以告诉表单更新?据我了解,您需要关闭外部定义的原子,以便传播更改?
  • 通过关闭form-state 原子,我可以创建组件本地状态。

标签: clojurescript reagent reagent-forms


【解决方案1】:

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

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

【讨论】:

  • 作为答案是有道理的,但是如何重新构建文档参考?
  • re-frame 文档对使用试剂有一些非常好的建议。
【解决方案2】:

正如已经指出的,您的渲染函数必须引用状态原子中的某些内容,以便知道何时需要重新渲染。但是,如果您还希望显示的表单选择“默认”值,则还需要设置状态原子。

绑定字段调用会将您的表单与状态原子相关联。如果状态原子中没有任何内容,则表单将为“空白”,即没有选择任何元素。如果这是你想要的,那应该没问题。但是,如果您想要选择一个值,那么您应该将该值放入原子中。例如,如果您希望第一项已被选中,则将 :24 放入状态原子,即

(swap! form-state assoc :mail-account :24)

请注意,我不确定您的选项定义是否正确。文档似乎表明您只需要 :key 属性和该属性中的值(作为关键字)。我没有查看源代码来确认这一点,但没有一个示例也使用 :value 属性。

如果您在渲染函数的开头进行交换,那么状态原子将被引用,并且您的组件应在每次使用新参数调用时重新渲染。当我说“渲染函数”时,在这种情况下,我指的是匿名函数,而不是创建状态原子的外部函数。

【讨论】:

  • 什么是'gind-fields 调用'?我什至找不到问题中的“gind”一词。我稍后会删除此评论(我猜这意味着不要在此评论下方发表评论,否则我将无法 - 不确定)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多