处理mobx @computed反应

时间:2016-09-13 08:10:38

标签: typescript mobx

在下面的文章中,它说应该处理mobx的反应: https://mobxjs.github.io/mobx/best/pitfalls.html

用@computed装饰器标记的属性是一种反应,因此它们似乎也需要处理。问题是,与显式调用autorun(),observe()或其他返回处理函数的反应不同,@ computed装饰器似乎不能让我们处理这种反应。

所以问题是 - 应该如何处理@computed装饰器定义的反应?

以下示例中可能会显示未处理的问题

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

只要'会员'是活着的,观察者将保持活着,除非包裹doubled()的反应将被处置。即使我们将一个dispose()函数添加到Observer并自己调用它,我也不明白我们如何能够访问doubled()的基础反应来处理它。

1 个答案:

答案 0 :(得分:5)

MobX会自动处理计算值(甚至在需要时进行重新实例化)。 MobX可以这样做,因为它们应该没有副作用。因此,每当MobX确定没有观察者对计算值感兴趣时,它们将自动暂停,从计算机可能使用的任何可观察量中取消订阅。此时它可能是GC-ed(例如因为拥有对象超出范围),或者因为新观察者注册而重新激活。

换句话说,在您的示例中,Observer将不会保持活动状态(也不会观察Observed),并且可以安全地进行GC编辑。只有当你(或间接地)在某个反应中使用它时,它才能保持活力,比如

const disposer = reaction(() => observer.double, x => console.log(x))