clojure:试剂:如何创建反应原子

clojure: reagent: how to create reaction atom

Github/Google

我知道 Google/Github 上有答案。 (我知道这是可能的,因为我在过去的某个时候阅读了它的文档。)但是,我似乎根本找不到它。

一般背景

Clojure Reagent 具有 "r/atom" 形式

  (def some-input (r/atom ""))

然后,如果我定义一个组件,例如:

(fn []
  [:div @some-input])

它具有 属性 当输入原子改变时,div 更新。

反应原子

Clojure Reagent 有一个叫做 "reaction" 的东西,我们可以在其中定义:

(def ra (r/atom ""))
(def rb ... I HAVE NO IDEA WHAT TO PUT HERE ...)

用 属性 表示 @rb = (f @ra) -- 这样一来,无论何时更新 ra,rb 都会自动更新为 (f @ra)

我记得这叫做 "reaction atom" 之类的 -- 但我找不到它。

真题:

我在里面放了什么:

(def rb ... I HAVE NO IDEA WHAT TO PUT HERE ...)

编辑解决:

已记录 https://github.com/Day8/re-frame (又一个很酷的项目,也是用了Reagent)

具体例子是:

(def app-db  (reagent/atom {:a 1}))           ;; our root ratom  (signal)

(def ratom2  (reaction {:b (:a @app-db)}))    ;; reaction wraps a computation, returns a signal
(def ratom3  (reaction (condp = (:b @ratom2)  ;; reaction wraps another computation
                         0 "World"
                         1 "Hello")))

复制问题的答案只是为了将问题标记为已解决:

(def app-db  (reagent/atom {:a 1}))           ;; our root ratom  (signal)

(def ratom2  (reaction {:b (:a @app-db)}))    ;; reaction wraps a computation, returns a signal
(def ratom3  (reaction (condp = (:b @ratom2)  ;; reaction wraps another computation
                     0 "World"
                     1 "Hello")))