Observable
在 MobX 中任何属性、对象、数组、Map、Set 等都可以被转化为可观察对象(Observable),要完成这一转化,需要使用 makeObservable() 为对象中的属性和方法等指定注解。makeObservable() 中所使用的注解主要有以下几个。
observable,标记一个用于存储 State 的可被追踪的字段。observable.ref,仅当被重新赋值时才进行追踪。observable.shallow,不跟踪集合中元素的值。observable.struct,仅跟踪值的结构。
action,标记一个可以修改 State 的方法。computed,标记一个可以由 State 派生出新值的 Getter。computed.bound,仅关注计算结果的结构不同。
flow,标记一个生成器函数成员,主要用于管理异步进程。override,用于子类覆盖继承标记。true,自动推断最佳注解。false,不为成员指定注解。
对于 Map 、Set、数组这样的集合将被自动转化为可观察对象。
构建可观察对象的函数有以下三个。
makeObservable(target, annotations, options),用于手动对类进行标记。makeAutoObservable(target, overrides, options),用于利用自动推断对类或者工厂类进行标记。observable(source, overrides, options),用于对对象进行转换。
以下是这三个函数的使用方法示例。
import { makeObservable, observable, computed, action } from 'mobx';
class GearBox {
currentGear;
constructor(currentGear) {
makeObservable(this, {
currentGear: observable,
gear: computed,
shiftUp: action,
shiftDown: action
});
this.currentGear = currentGear;
}
get gear() {
return this.currentGear;
}
shiftUp() {
this.currentGear++;
}
shiftDown() {
this.currentGear--;
}
}
如果使用 makeAutoObservable 上面这个示例就可以简化成下面的样子。
import { makeAutoObservable } from 'mobx';
class GearBox {
currentGear;
constructor(currentGear) {
makeAutoObservable(this);
this.currentGear = currentGear;
}
get gear() {
return this.currentGear;
}
shiftUp() {
this.currentGear++;
}
shiftDown() {
this.currentGear--;
}
}
至于 observable 的使用就比较简单了。
import { observable } from 'mobx';
const worksList = observable([
{
work_id: '123',
title: 'Something to do.',
done: false
}
]);
一旦使用 observable 将一个对象转化为可观察对象,那么对这个对象进行任何操作,都可以被 MobX 所追踪到。