2

次の記事では、mobx の反応を破棄する必要があると述べています: https://mobxjs.github.io/mobx/best/pitfalls.html

@computed デコレータでマークされたプロパティは一種の反応なので、それらも破棄する必要があるようです。問題は、disposer 関数を返す 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() をラップするリアクションが破棄されない限り、「メンバー」が生きている限り、オブザーバーは生き続けます。Observer に dispose() 関数を追加して自分で呼び出しても、 doubled() の基になる反応にアクセスして破棄する方法がわかりません。

4

1 に答える 1

5

計算された値は、MobX によって自動的に破棄されます (必要に応じて再インスタンス化されます)。MobX がこれを実行できるのは、副作用がないと想定されているためです。そのため、MobX が計算された値に関心を持っているオブザーバーが存在しないと判断すると、それらは自動的に一時停止され、計算されたオブジェクト自体が使用する可能性のあるオブザーバブルからサブスクライブが解除されます。この時点で、(たとえば、所有しているオブジェクトがスコープを使い果たしたために) GC されるか、新しいオブザーバーが登録されたために再アクティブ化される可能性があります。

言い換えれば、あなたの例では Observer は存続せず (Observed を観察することもありません)、安全に GC を実行できます。次のような反応で(間接的に)使用する場合にのみ、生き続けます。

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