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

欢迎!请参阅 关于 页面了解有关该功能的更多信息。

+2
ClojureScript
编辑

假设我有一个以下这样的组件,它有一个局部状态和一些观察逻辑

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

我应该关心移除观察者(如果是,最好的方法是什么),还是组件卸载时它会自动发生。

2 个回答

+1
 
最佳答案

我刚刚看了源代码,并发现了以下内容

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

源代码

因此我认为这取决于作用域。在我的情况下,`local-state` 原子在一个闭包内,因此一旦它被移除,相关的所有观察者也应自动移除。然而,对于全局作用域中的原子,如果不再需要,则应手动移除观察者。

0
by

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

"remove-watch 应该在 finally 子句中调用。React 和 Reagent 并没有隐式地意识到你调用了一个原子上的 add-watch。即使这个原子被垃圾回收,我也认为无法保证监视器不会留在内存中。"

要移除监视器,我们可以在 r/with-let 宏中使用 finally 子句。

...