我正在尝试理解这段来自Web Development With Clojure的代码。关于clojure脚本:
(defn message-form []
(let [fields (atom {})]
(fn []
[:div.content
[:div.form-group
[:p "Name:"
[:input.form-control
{:type :text
:name :name
:on-change #(swap! fields assoc :name (-> % .-target .-value))
:value (:name @fields)}]]]
[:p "Message:"
[:textarea.form-control
{:rows 4
:cols 50
:name :message
:on-change #(swap! fields assoc :message (-> % .-target .-value))}
(:message @fields)]]
[:input.btn.btn-primary {:type :submit :value "comment"}]])))
有人能解释一下这部分吗:
#(swap! fields assoc :name (-> % .-target .-value)
尤其是这个:...(-> %.-Target.-value)
发布于 2018-08-19 05:58:27
[:input {:on-change #(swap! fields assoc :name (-> % .-target .-value)}]
这定义了一个输入和一个函数,每次用户更改输入字段,即在其中键入内容时,都会调用该函数。将使用change事件对象作为参数调用该函数,然后将该参数绑定到%
。事件目标是输入字段DOM元素,该元素的文本内容为value
。然后,该函数将fields
更改为以:name
形式包含该内容。
#(…)
和%
属于同一类:#(…)
创建一个匿名函数,%
是其参数的名称。
->
是一个宏,它将表单中常见的松散前缀组合转换为类似后缀组合或“管道”的形式:(-> % .-target .-value)
扩展为(.-value (.-target %))
。
.-value
符号是ClojureScript中的JavaScript互操作。它表示对JavaScript对象的字段"value“的访问;ClojureScript中的(.-value foo)
本质上等同于在JavaScript中编写foo.value
或foo["value"]
。
发布于 2018-08-19 01:27:05
#()
是一个reader macro。它是匿名函数(fn [args] ...)
的缩写,其中%
是该函数的第一个参数。
在这种情况下,#(swap! fields assoc :name (-> % .-target .-value)
等于(fn [X] (swap! fields assoc :name (-> X .-target .-value))
->
是一个threading macro,(-> X .-target .-value)
等同于(.-value (.-target X))
。
(.-target X)
表示获取对象X
的属性target
。
所以你定义了一个匿名函数,它只接受一个参数。此函数将更改fields
原子,以便将其键:name
设置为对象value
的属性target
中对象的属性X
的值。
https://stackoverflow.com/questions/51910951
复制相似问题