Связывание при изменении в 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))))
- Что
.-value
а также.-target
делать? - Где я могу найти документацию для
.-value
а также.-target
? - Зачем выбирать более сложную семантику?
1 ответ
evt
то, что входит в вашу функцию, является объектом события JavaScript. .-target
а также .-value
являются свойствами DOM JavaScript, которые позволяют вам получить доступ к базовому значению, которое содержит событие.
Здесь вы находитесь в мире JavaScript взаимодействия, поэтому вам придется перейти к JavaScript для документации.
Насколько сложная семантика использования ->
макрос или нет: это просто удобно для людей, которые любят раскручивать свойства слева направо во время чтения. ->
макрос сделает ваш код похожим на эквивалентный код JavaScript.