请在2024 Clojure状态调查!分享您的想法。

欢迎!请查看关于页面了解更多关于该功能的信息。

+2 投票
ClojureScript
编辑

假设我有一个以下具有局部状态和某些监视逻辑的组件

(defn some-component []
  (r/with-let [local-state (r/atom {...})
               _ (add-watch local-state :on-change handle-change)]
    [:div ...]))

我是否应该关心移除watcher(如果是,什么是最合适的做法),还是当组件卸载时会自动发生。

2 个答案

+1 投票
 
最佳答案

我只是查看了一下源代码,发现如下

  (-add-watch [this key f]
    (set! (.-watches this) (assoc watches key f))
    this)

源代码

所以我认为这取决于范围。在我的情况中,local-state原子位于闭包中,因此一旦它被移除,它的所有观察者也应当自动移除。然而,对于在全局范围内的原子,如果它们不再需要,应该手动移除观察者。

0 投票

在Slack聊天中,jahson指出了类似的问题
https://www.reddit.com/r/Clojure/comments/8k3ku0/do_i_need_to_removewatch_in_reagent_components/

"应该在不使用finally子句的情况下调用remove-watch。React和Reagent并不知道你向原子添加了watch方法。即使原子被垃圾回收,也不能保证watch不会留在内存中。"

为了移除watcher,我们可以在r/with-let宏中使用finally子句。

...