在下面的文章中,它说应该处理mobx的反应:https ://mobxjs.github.io/mobx/best/pitfalls.html
用@compute装饰器标记的属性是一种反应,因此似乎也需要对其进行处理。问题在于,与显式调用autorun(),observe()或其他反应(返回一个处置函数)不同,@ compute装饰器似乎无法使我们处置该反应。
所以问题是-应该如何处理@compute装饰器定义的反应?
以下示例可能会显示不处理的问题
export class Observed {
@observable
public x: number;
}
export class Observer {
constructor(private member: Observed){
}
@computed
get doubled(){
return this.member.x*2;
}
}
let member = new Observed();
let observer = new Observer(member);
// now pass observer as a model to some react component and use its doubled property
Run Code Online (Sandbox Code Playgroud)
只要“成员”还活着,观察者将一直活着,除非将包装doubled()的反应处理掉。即使我们将Obpose()函数添加到Observer并自己调用它,我也不明白我们如何访问doubled()的底层反应来对其进行处理。
MobX自动处理(甚至在需要时重新设置)计算值。MobX可以做到这一点,因为它们应该没有副作用。因此,每当MobX确定不再有观察者对计算值不再感兴趣时,它们将被自动挂起,不再订阅计算值可能使用的任何可观察值。此时,它可能是GC版本(例如,由于拥有对象超出范围),或者由于新的观察者注册而重新激活了它。
换句话说,在您的示例中,Observer不会保持活动状态(也不会观察到Observed),并且可以安全地进行GC处理。仅当您在某个地方的反应中(间接地)使用它时,它才能保持活力
const disposer = reaction(() => observer.double, x => console.log(x))
Run Code Online (Sandbox Code Playgroud)