欢迎!请参阅 关于 页面了解有关该功能的更多信息。
假设我有一个以下这样的组件,它有一个局部状态和一些观察逻辑
(defn some-component [] (r/with-let [local-state (r/atom {...}) _ (add-watch local-state :on-change handle-change)] [:div ...]))
我应该关心移除观察者(如果是,最好的方法是什么),还是组件卸载时它会自动发生。
我刚刚看了源代码,并发现了以下内容
(-add-watch [this key f] (set! (.-watches this) (assoc watches key f)) this)
源代码
因此我认为这取决于作用域。在我的情况下,`local-state` 原子在一个闭包内,因此一旦它被移除,相关的所有观察者也应自动移除。然而,对于全局作用域中的原子,如果不再需要,则应手动移除观察者。
在 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 子句。
r/with-let
finally