强制试剂组件在窗口调整大小时更新

问题描述 投票:1回答:2

我正在尝试实现一个试剂组件,它跟踪它的外部html元素的实际计算大小。以下作品:

(defn i-show-my-size []
  (let [size (r/atom nil)]
    (r/create-class {:component-will-mount
                     (fn [this]
                       (set! (.-onresize js/window)
                             (r/force-update this)))
                     :reagent-render
                     (fn []
                       [:div {:ref #(when % (reset! size (let [bb (.getBoundingClientRect %)]
                                                           [(.-width bb) (.-height bb)])))}
                        (prn-str @size)])})))

有没有更好的方法呢?例如。我是否需要创建类符号或者是否可能没有?

clojurescript reagent
2个回答
2
投票

实际上,你可以使用r / with-let和r / current-component使它在没有form-3组件的情况下工作:

(defn get-client-rect [node]
  (let [r (.getBoundingClientRect node)]
    {:left (.-left r), :top (.-top r) :right (.-right r) :bottom (.-bottom r) :width (.-width r) :height (.-height r)}))

(defn size-comp []
  (r/with-let [size (r/atom nil)
               this (r/current-component)
               handler #(reset! size (get-client-rect (r/dom-node this)))
               _ (.addEventListener js/window "resize" handler)]
    [:div "new size " @size]
    (finally (.removeEventListener js/window "resize" handler))))

0
投票

0.6.0介绍了with-lethttp://reagent-project.github.io/news/news060-alpha.html)他们的例子(如下)与你的用例非常相似:

(defn mouse-pos-comp []
  (r/with-let [pointer (r/atom nil)
               handler #(swap! pointer assoc
                               :x (.-pageX %)
                               :y (.-pageY %))
               _ (.addEventListener js/document "mousemove" handler)]
    [:div
     "Pointer moved to: "
     (str @pointer)]
    (finally
      (.removeEventListener js/document "mousemove" handler))))
© www.soinside.com 2019 - 2024. All rights reserved.