在clojurescript /试剂/ reagi中跟踪鼠标?

int*_*tar 8 clojurescript reagent

我正试图用一个简单的绘图程序来处理clojurescript中的试剂.

我正在寻找一个如何使用Reagi以原则性的"FRP"风格访问鼠标位置的示例.

在各种试剂示例中,我可以看到如下所示的内容:

[:p [:onmousemove (fn (evt) ...)]]
Run Code Online (Sandbox Code Playgroud)

将处理程序附加到DOM的元素.

为了做一个Reagi"行为"我想写这样的东西:

(def mouse-positions (r/behavior ( ... )))
Run Code Online (Sandbox Code Playgroud)

但是我如何将这两者结合起来,以便我添加到DOM元素的处理程序提供Reagi行为?

其次,当我使用试剂时,我期望这些DOM节点能够定期重新创建.据推测,我还需要继续将事件处理程序重新绑定到Reagi流.我如何确保这一点?

干杯

小智 2

我想知道 Reagi 的事件流是否更适合。大致如下:

(defonce mouse-events (r/events {:x 0 :y 0}))

(defn home-page []
  [:div {:onMouseMove (fn [event]
                        (r/deliver mouse-events {:x (.-clientX event)
                                                 :y (.-clientY event)}))}])
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用取消引用事件流@mouse-events。您不必担心必须重新绑定到事件流,因为它保存了对事件流的引用。

但是,请记住,将值推入 Reagi 流不会导致 Reagent 重新渲染直接引用它的节点。为此,您将需要某种试剂原子。

如果您正在创建一个绘图应用程序,我想您的状态/原子将存储在其他地方,并且您swap!reset!那个会导致渲染发生。

另请注意,行为和事件都仅保留对最新值的引用,这对于绘图应用程序可能并不理想。还有 Reagibuffer可能会对此有所帮助。