我是 Clojure 和 Reagent 的新手。请告诉如何在原子变量联系人中首先打印变量?
(def app-state (r/atom {:contacts [{:first "Ben" :last "Lem" :middle "Ab"}]}))
我是 Clojure 和 Reagent 的新手。请告诉如何在原子变量联系人中首先打印变量?
(def app-state (r/atom {:contacts [{:first "Ben" :last "Lem" :middle "Ab"}]}))
首先:试剂教程是一个非常好的起点。它甚至为您提供了解决此问题的示例。
由于可以将试剂atom
视为常规 Clojurescript 原子,因此您可以使用所有正常的序列操作。请记住,为了访问当前值,您必须通过取消引用原子@
。如果您真的只想访问:first
原子中的第一个:
(:first (first (:contacts @app-state)))
或者(get (first (get @app-state :contacts)) :first)
或者,如果您认为它更具可读性
(-> @app-state
:contacts
first
:first)
我想您可能想要做的是定义一些函数以使访问更容易,例如:
(defn get-contacts!
"Returns the current vector of contacts stored in the app-state."
[]
(:contacts @app-state))
(defn get-first-names!
"Return a vector of all first names in the current list of contacts in the
app-state."
[]
(mapv :first (get-contacts!)))
请记住,在试剂中(实际上是一般情况下),您可能希望尽可能少地取消引用该原子,因此请寻找一个取消引用它的好地方,只需使用对简单序列而不是原子进行操作的常规函数.
不过,我真的建议您阅读上述试剂教程。
这是使用 Clojure 的(get-in m ks)函数访问您正在寻找的值的简洁方法:
(get-in @app-state [:contacts 0 :first])
作为一个额外的,你可能会看到这经常写成
(->> @app-state
:contacts
(mapv :first)
first
了解这里发生的事情很有用。
->>
是一个名为 thread-last 的宏,它将把上面的代码重写为
(first (mapv :first (:contacts @app-state)))
Thread last 一开始有点奇怪,但是当很多事情发生时,它使代码更具可读性。我建议您在其他评论中提到的试剂教程的基础上阅读此内容。
@app-state
将为您提供 r/atom 中的任何内容,(:first (first (:contacts @app-state)))
并将返回第一个元素并将(println (:first (first (:contacts @app-state))))
输出打印到浏览器控制台(因此您需要打开开发人员工具控制台才能看到它)。
请注意,println
要输出到浏览器开发人员工具控制台,您需要在代码中包含以下行:
(enable-console-print!)