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