Связывание при изменении в ClojureScript/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. Зачем выбирать более сложную семантику?

1 ответ

Решение

evt то, что входит в вашу функцию, является объектом события JavaScript. .-target а также .-value являются свойствами DOM JavaScript, которые позволяют вам получить доступ к базовому значению, которое содержит событие.

Здесь вы находитесь в мире JavaScript взаимодействия, поэтому вам придется перейти к JavaScript для документации.

Насколько сложная семантика использования -> макрос или нет: это просто удобно для людей, которые любят раскручивать свойства слева направо во время чтения. -> макрос сделает ваш код похожим на эквивалентный код JavaScript.

Другие вопросы по тегам