我们有感人的 clojurescript代码,但是当单击缩略图时图像发生变化时,所选图像需要使用缩放器进行渲染。
我们开始点击缩略图,这会改变所选图像的原子,并传递给缩放器代码:
(r/with-let [selected (r/atom (-> images first))]
[:img.mx-auto.d-block.img-thumbnail {
:src thumbnail_small
:on-click #(reset! selected img)}]
[:div.col-sm-10
[zoomer selected]
]
]])
使用图像 url 安装组件。zoomer [image]
渲染组件安装时(第一次)工作时传递图像原始大小的 url [:img {:src image
,但是当单击另一个图像时,原子会做出反应但不会“重新渲染”:
(defn zoomer [image]
(let [!hammer-manager (atom nil)
!zoom (atom {:x 0 :y 0 :scale 1})
!start-zoom (atom {:x 0 :y 0 :scale 1})]
(r/create-class
{:component-did-mount
(fn [this]
(let [mc (new js/Hammer.Manager (r/dom-node this))]
(println this.add)
;; Pinch
(js-invoke mc "add" (new js/Hammer.Pinch))
(js-invoke mc "on" "pinchstart" #(do (reset! !start-zoom @!zoom)
(.preventDefault %)))
(js-invoke mc "on" "pinchmove" #(let [{:keys [x y scale]} @!start-zoom]
(reset! !zoom {:x (+ x (.-deltaX %))
:y (+ y (.-deltaY %))
:scale (* scale (.-scale %))})
(.preventDefault %)))
(reset! !hammer-manager mc)
))
:reagent-render
(fn [_]
[:div.zoomer
[:img {:src image
:style (transform @!zoom)}]])
:component-will-unmount
(fn [_]
(when-let [mc @!hammer-manager]
(js-invoke mc "destroy")))})))
我看到了这个使用带有 G Maps 的有状态 JS 组件的例子。