MobX 自动运行行为

MobX autorun behavior

我正在探索 MobX 并被一个问题所吸引:

如果我有这个 observable:

class ItemsStore {
    @observable items = [1,2,3];
}
const store = new ItemsStore;

然后这样改:

setInterval(() => {
    store.items[0] = +new Date
}, 1000)

我注意到以下几点:

这背后的API逻辑是什么?我希望因为 store.items 永远不会触发,所以 未更改的属性 会表现相同。

为什么 MobX 知道我的回调中有什么代码?它在分析我传递给 autorun 的回调吗?

console.log(store.items)

当在上一个 auto运行 中取消引用的 observable 发生更改时,将触发 auto运行。 store.items 不取消引用任何可观察对象。尝试 store.items.slice()store.items.toJS() 以获得所需的效果。

console.log(store.items[0])

这被触发是因为取消引用的 observable 发生了变化。

console.log(store.items.length)

这是 运行 因为 MobX 数组不是真正的数组。 length 属性 是 defined as follows:

Object.defineProperty(ObservableArray.prototype, "length", {
    enumerable: false,
    configurable: true,
    get: function(): number {
        return this.$mobx.getArrayLength();
    },
    set: function(newLength: number) {
        this.$mobx.setArrayLength(newLength);
    }
});

getArrayLength reports that the MobX array has been observed:

getArrayLength(): number {
    this.atom.reportObserved();
    return this.values.length;
}