2

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

用 @computed 装饰器标记的属性是一种反应,因此似乎也需要处置它们。问题在于,与显式调用 autorun()、observe() 或其他返回 disposer 函数的反应不同,@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() 的反应会被释放。即使我们向 Observer 添加一个 dispose() 函数并自己调用它,我也不明白我们如何访问 doubled() 的底层反应来处理它。

4

1 回答 1

5

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

换句话说,在您的示例中,Observer 不会保持活动状态(也不会被观察 Observed),并且可以安全地进行 GC-ed。仅当您(间接)在某处的反应中使用它时,它才会保持活动状态,例如

const disposer = reaction(() => observer.double, x => console.log(x))
于 2016-09-13T17:05:03.050 回答