Javascript MobX自动运行行为
我正在探索MobX,被一个问题吸引住了: 如果我能观察到这一点:Javascript MobX自动运行行为,javascript,mobx,Javascript,Mobx,我正在探索MobX,被一个问题吸引住了: 如果我能观察到这一点: class ItemsStore { @observable items = [1,2,3]; } const store = new ItemsStore; 然后像这样改变它: setInterval(() => { store.items[0] = +new Date }, 1000) 我注意到以下几点: autorun(()=>console.log(store.items)) autorun((
class ItemsStore {
@observable items = [1,2,3];
}
const store = new ItemsStore;
然后像这样改变它:
setInterval(() => {
store.items[0] = +new Date
}, 1000)
我注意到以下几点:
autorun(()=>console.log(store.items))代码>
autorun(()=>console.log(store.items[0])代码>
autorun(()=>console.log(store.items.length))代码>
store.items
从不激发,所以未更改的属性也会表现相同
为什么MobX知道我的回调中有什么代码?是否正在分析我传递给自动运行的回调?console.log(store.items)
当上次自动运行中取消引用的观测值发生更改时,将触发自动运行<代码>存储。项
不取消对任何可观察项的引用。尝试store.items.slice()
或store.items.toJS()
以获得所需的效果
console.log(store.items[0])
这是因为取消引用的可观察对象已更改而触发的
console.log(store.items.length)
这是因为MobX数组不是真正的数组而运行的。length
属性是:
getArrayLength
:
根据文档,自动运行不仅观察todo数组,而且还观察todo项中的各个属性。因此,我猜如果数组中的任何项正在主动disparying value或使用value进行任何其他计算,则自动运行将触发。否则,不会的,在文件里有一个很好的解释,关于这个…塔克·索勒!(谢谢!)@Rikard Det var sålite så.:)
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(): number {
this.atom.reportObserved();
return this.values.length;
}