请在2024 拉克鲁斯状态调查!中分享你的想法。

欢迎!请参阅关于页面了解更多工作方式的信息。

+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

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

"应在finally子句中调用remove-watch。React和Reagent并不会隐式地意识到你在atom上调用add-watch。即使atom被垃圾回收,也不能保证不会在内存中留下监视器。"

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

...