gpt4 book ai didi

typescript - 处理 mobx @computed reactions

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:12 26 4
gpt4 key购买 nike

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

用@computed装饰器标记的属性是一种 react ,所以看起来它们也需要被处理掉。问题在于,与显式调用 autorun()、observe() 或其他返回处置函数的 react 不同,@computed 装饰器似乎无法让我们处置该 react 。

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

不释放的问题可能会在下面的例子中体现

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

只要'member'还活着,observer就会一直活着,除非包裹doubled()的reaction被处理掉。即使我们向 Observer 添加一个 dispose() 函数并自己调用它,我也不明白我们如何访问 doubled() 的底层 react 来处理它。

最佳答案

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

换句话说,在您的示例中,Observer 将不会保持事件状态(也不会观察 Observed)并且可以安全地对其进行 GC-ed。只有当你在某个地方的 react 中(间接地)使用它时,它才会保持活力,比如

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

关于typescript - 处理 mobx @computed reactions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39465151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com