在 ClojureScript/Reagent 中绑定更改

Binding on-change in ClojureScript/Reagent

我想了解输入字段在 Reagent 中的工作原理。

我首先尝试将 on-change 绑定到一个更改底层原子的简单函数:

(defonce app-state
  (reagent/atom "Teodor"))

(defn page [ratom]
  [:div
    [:p
      "Please enter your name: "
      [:input {:on-change #(swap! ratom %)
               :value @ratom}]]
    [:p "Your name is " @ratom]])

... 没有用。然而,这确实:

(defonce app-state
  (reagent/atom "Teodor"))

(defn page [ratom]
  [:div
    [:p
      "Please enter your name: "
      [:input {;:on-change #(swap! ratom %)
               :on-change (fn [evt]
                             (reset! ratom (-> evt .-target .-value)))
               :value @ratom}]]
    [:p "Your name is " @ratom]])

我已经成功地对 -> 宏进行了脱糖处理:

(fn [evt]
  (reset! ratom (-> evt .-target .-value)))
;; is the same as
(fn [evt]
  (reset!
    ratom
    (.-value (.-target evt))))
  1. .-value.-target 是做什么的?
  2. 在哪里可以找到 .-value.-target 的文档?
  3. 为什么选择更复杂的语义?

进入您的函数的 evt 是一个 JavaScript 事件对象。 .-target.-value 是 JavaScript DOM 属性,允许您访问事件持有的基础值。

这里是 JavaScript 互操作的世界,因此您必须前往 JavaScript 获取文档。

至于是否使用 -> 宏的复杂语义:这对于喜欢在阅读时从左到右剥离属性的人来说非常方便。 -> 宏将使您的代码看起来类似于等效的 JavaScript 代码。