4

我是 Clojure 和 Reagent 的新手。请告诉如何在原子变量联系人中首先打印变量?

(def app-state (r/atom {:contacts [{:first "Ben" :last "Lem" :middle "Ab"}]}))

4

4 回答 4

2

首先:试剂教程是一个非常好的起点。它甚至为您提供了解决此问题的示例。

由于可以将试剂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!)))

请记住,在试剂中(实际上是一般情况下),您可能希望尽可能少地取消引用该原子,因此请寻找一个取消引用它的好地方,只需使用对简单序列而不是原子进行操作的常规函数.

不过,我真的建议您阅读上述试剂教程

于 2016-01-26T13:52:20.527 回答
2

这是使用 Clojure 的(get-in m ks)函数访问您正在寻找的值的简洁方法:

(get-in @app-state [:contacts 0 :first])
于 2016-01-28T06:49:55.603 回答
1

作为一个额外的,你可能会看到这经常写成

(->> @app-state
     :contacts
     (mapv :first)
     first

了解这里发生的事情很有用。

->>是一个名为 thread-last 的宏,它将把上面的代码重写为

(first (mapv :first (:contacts @app-state)))

Thread last 一开始有点奇怪,但是当很多事情发生时,它使代码更具可读性。我建议您在其他评论中提到的试剂教程的基础上阅读内容。

于 2016-01-26T16:06:29.360 回答
0

@app-state将为您提供 r/atom 中的任何内容,(:first (first (:contacts @app-state)))并将返回第一个元素并将(println (:first (first (:contacts @app-state))))输出打印到浏览器控制台(因此您需要打开开发人员工具控制台才能看到它)。

请注意,println要输出到浏览器开发人员工具控制台,您需要在代码中包含以下行:

(enable-console-print!)
于 2016-01-26T13:56:01.567 回答