Computed

Computed 是用来从其他可观察对象中派生新的信息的,一般都会采用惰性求值和缓存输出等方法来处理,而且 Computed 也只有在其依赖的可观察对象发生改变的时候才会重新计算。Computed 可以有效的减少需要存储的 State 数量,所以在任何情况下,请尽可能的优先使用 Computed。

在使用 makeAutoObservable 对对象进行标记的时候,它会自动的将所有的 Getter 都标记为 computed。以下是一个官方的示例,可以直接运行观察一下效果。

import { makeObservable, observable, computed, autorun } from 'mobx';

class OrderRecord {
  price = 0;
  amount = 1;

  constructor(price) {
    makeObservable(this, {
      price: observable,
      amount: observable,
      total: computed
    });
    this.price = price;
  }

  get total() {
    console.log('Computing...');
    return this.price * this.amount;
  }
}

const record = new OrderRecord(0);
const stop = autorun(() => {
  console.log(`Total: ${record.total}`);
});

console.log(record.total);
record.amount = 5; // 不会重新计算,因为 total 依旧是 0
record.price = 2; // 会重新计算,因为 total 发生了变化
stop();
order.price = 3; // 不再计算,监控过程已经结束

在使用 Computed 的时候,需要遵守以下三个原则:

  1. Computed 不应该有任何副作用。
  2. Computed 不能更新任何可观察对象。
  3. 不能创建和返回新的可观察对象。

因为 Getter 一般都作为 Computed 出现,所以与 Getter 相对应的 Setter 都作为 Action 出现。