原值类型值和引用类型值

JavaScript 中的所有原始类型值都是不可变的,因此它们都是不可观察的。通常这是好的,因为 MobX 通常可以使包含值的属性转变成可观察的。可参见 observable objects。在极少数情况下,拥有一个不属于某个对象的可观察的“原始类型值”还是很方便的。对于这种情况,可以创建一个 observable box 以便管理这样的原始类型值。

observable.box(value)

observable.box(value) 接收任何值并把值存储到箱子中。使用 .get() 可以获取当前值,使用 .set(newValue) 可以更新值。

此外,还可以使用它的 .observe 方法注册回调,以监听对存储值的更改。但因为 MobX 自动追踪了箱子的变化,在绝大多数情况下最好还是使用像 mobx.autorun 这样的 reaction 来替代。

observable.box(scalar) 返回的对象签名是:

  • .get() - 返回当前值。
  • .set(value) - 替换当前存储的值并通知所有观察者。
  • intercept(interceptor) - 可以用来在任何变化应用前将其拦截。参见 observe & intercept
  • .observe(callback: (change) => void, fireImmediately = false): disposerFunction - 注册一个观察者函数,每次存储值被替换时触发。返回一个函数以取消观察者。参见 observe & interceptchange 参数是一个对象,其中包含 observable 的 newValueoldValue

observable.shallowBox(value)

shallowBox 创建一个基于 ref 调节器的箱子。这意味着箱子里的任何(将来)值都不会自动地转换成 observable 。

observable(primitiveValue)

当使用通用的 observable(value) 方法时, MobX 会为任何不能转换成 observable 的值自动创建一个 observable 箱子。

示例

  1. import {observable} from "mobx";
  2. const cityName = observable("Vienna");
  3. console.log(cityName.get());
  4. // 输出 'Vienna'
  5. cityName.observe(function(change) {
  6. console.log(change.oldValue, "->", change.newValue);
  7. });
  8. cityName.set("Amsterdam");
  9. // 输出 'Vienna -> Amsterdam'

数组示例:

  1. import {observable} from "mobx";
  2. const myArray = ["Vienna"];
  3. const cityName = observable(myArray);
  4. console.log(cityName[0]);
  5. // 输出 'Vienna'
  6. cityName.observe(function(observedArray) {
  7. if (observedArray.type === "update") {
  8. console.log(observedArray.oldValue + "->" + observedArray.newValue);
  9. } else if (observedArray.type === "splice") {
  10. if (observedArray.addedCount > 0) {
  11. console.log(observedArray.added + " added");
  12. }
  13. if (observedArray.removedCount > 0) {
  14. console.log(observedArray.removed + " removed");
  15. }
  16. }
  17. });
  18. cityName[0] = "Amsterdam";
  19. // 输出 'Vienna -> Amsterdam'
  20. cityName[1] = "Cleveland";
  21. // 输出 'Cleveland added'
  22. cityName.splice(0, 1);
  23. // 输出 'Amsterdam removed'

名称参数

observable.boxobservable.shallowBox 都接收第二个参数作为 spy 或者 MobX 开发者工具中的调试名称。