clojurescript - 如何在带有点击事件的试剂渲染后更改状态(img 的 src)clojurescript 组件
问题描述
我们有感人的 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 组件的例子。
解决方案
我找到了解决方案。
1.- 更改:reagent-render
为:render
。
2.-:render
添加一个let
withreagent/argv
来获取参数。这永远是第二个[_ **image**]
:
:render
(fn [this]
(let [[_ image] (r/argv this)]
[:div.zoomer
[:img {:src image
:style (transform @!zoom)}]]))
在此处编写参数是可选的:(defn zoomer [image]
. (defn zoomer []
如果我们使用r/argv
它找到参数,这将起作用。
这个例子帮助我 在内部组件 fns和试剂方法表格 3 的文档中允许生命周期元数据。
推荐阅读
- python - 选项卡完成不适用于 tensorflow 的某些功能
- laravel - 错误无法在我的 laravel vue js 项目中显示
- java - NavigatorView 中每个项目的 OnBackPressed
- elasticsearch - 无法启动 Elasticsearch (code=killed, signal=KILL)
- javascript - 字母数字字符串中带有可选点的正则表达式
- javascript - 数组未返回预期输出
- python - python在数据框中查找特定值
- excel-formula - 是否有一个excel函数计算可变利率下固定付款的未来价值
- css - 颜色变化,主要悬停
- javascript - 单击停止时如何在表单中提交计时器值?