尝试在数字类型上使用@observable时,不会创建Observable。这会导致出现问题,即每次获取计算值时都要重新计算。我不希望重新计算计算值,除非输入已更改,这是什么问题?

https://jsbin.com/mofirujixu/1/edit?html,js,console

class Square {
  @observable width = 2;

  @computed get area() {
    console.log('calc area');
    return this.width * this.width;
  }
}

const square = new Square();
//prints out 'calc area' each time
console.log(square.area);
console.log(square.area);
console.log(square.area);

最佳答案

MobX仅在一个或多个观察者观察某个计算结果时才对其进行缓存。它是通过这种方式实现的,以减少内存占用并允许垃圾回收器完成其工作。

您可以在日志前使用简单的autorun来查看实际效果:

class Square {
  @observable width = 2;

  @computed get area() {
    console.log('calc area');
    return this.width * this.width;
  }
}

const square = new Square();

autorun(() => {
  square.area;
  // square.area is now observed by one observer,
  // and will not be re-calculated for subsequent reads.
});
console.log(square.area);
console.log(square.area);
console.log(square.area);

10-07 12:12
查看更多