gpt4 book ai didi

clojure - clojurescript 原子的哪些更改会导致试剂组件重新呈现?

转载 作者:行者123 更新时间:2023-12-04 06:44:18 24 4
gpt4 key购买 nike

考虑以下试剂成分。它使用一个 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

最佳答案

我想我已经找到了为什么向量的行为不同于字符串/数字的答案。当 identical? 在旧值和新值之间返回 false 时,试剂将试剂原子计为“已更改”(并因此更新依赖于它的组件)。看到副标题“改变了吗?”在 this tutorial :

For ratoms, identical? is used (on the value inside the ratom) to determine if a new value has changed with regard to an old value.

然而,事实证明 identical? 对于向量和字符串/整数的行为不同。如果你启动 clj 或 cljs repl,你会看到:

(identical? 1 1)
;; true
(identical? "a" "a")
;; true
(identical? [1] [1])
;; false
(identical? ["a"] ["a"])
;; false

如果你看看 identical? 做了什么 here ,你会看到它测试它的参数是否是同一个对象。我认为底层的内部数据表示是这样的,在 clojure 中,“a”始终是与其自身相同的对象,而包含相同值的两个向量并不是彼此相同的对象。

确认:对于普通原子而不是试剂原子,我们可以看到字符串标识在原子重置过程中得以保留,而矢量标识则不然。

(def a1 (atom "a"))
(let [aa @a1] (reset! a1 "a") (identical? aa @a1))
;; true
(def a2 (atom ["a"]))
(let [aa @a2] (reset! a2 ["a"]) (identical? aa @a2))
;; false

关于clojure - clojurescript 原子的哪些更改会导致试剂组件重新呈现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39173424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com