【发布时间】:2020-03-10 02:52:56
【问题描述】:
考虑以下试剂成分。它使用 ref 函数,该函数根据 span 元素的实际大小更新局部状态原子。这样做是为了重新渲染显示其自身大小的组件
(defn show-my-size-comp []
(let [size (r/atom nil)]
(fn []
(.log js/console "log!")
[:div
[:span {:ref (fn [el]
(when el (reset! size (get-real-size el))))}
"Hello, my size is:" ]
[:span (prn-str @size)]])))
如果get-real-size 的实现返回一个向量,则日志消息会不断打印,这意味着组件一直不必要地重新渲染。如果它只返回一个数字或一个字符串,那么日志只会出现两次 - 正如本场景中所预期的那样。
这是什么原因?是否可能在内部使用新向量(尽管包含相同的值)更新 clojure 脚本原子意味着将另一个 JavaScript 对象放在那里,从而改变原子?而放置一个值不会产生可观察到的变化?只是猜测...*
无论如何 - 对于实际用例,将跨度的大小保存在向量中肯定会更好。有没有办法实现这一点?
当我试图增强this 问题中给出的答案时,我发现了这一点。
* 因为在 JS 中:({} === {}) // false
【问题讨论】:
-
我不在可以测试它的设置附近,但请尝试在
get-real-size中记录计算的大小。我的猜测是它在不断变化。那是因为每次它获得自己的大小并显示不同的值时,宽度都会发生变化,因此它会重新渲染,获得一个新的 ref,具有新的大小,具有不同的宽度...... -
不,我也猜到了。函数为 dummy 时也一样:
(defn get-real-size [_] [0 0])
标签: clojure clojurescript reagent