Javascript MobX自动运行只开火一次
我正在学习MobX,无法理解为什么Javascript MobX自动运行只开火一次,javascript,reactjs,mobx,Javascript,Reactjs,Mobx,我正在学习MobX,无法理解为什么autorun只发射一次 const {observable, autorun} = mobx; class FilterStore { @observable filters = {}; @observable items = [1,2,3]; } const store = window.store = new FilterStore; setInterval(() => { store.items[0] = +new Da
autorun
只发射一次
const {observable, autorun} = mobx;
class FilterStore {
@observable filters = {};
@observable items = [1,2,3];
}
const store = window.store = new FilterStore;
setInterval(() => {
store.items[0] = +new Date
}, 1000)
autorun(() => {
console.log(store.filters);
console.log(store.items);
console.log('----------------');
});
jsFiddle:
这是一个非常简单的设置,setInterval
每秒都在更改我的可观察数组的值,但是没有触发autorun
。。。知道为什么吗
…而setInterval
每秒都在更改我的可观察数组的值
不,不是。它正在改变数组的内容,但不是观察到的MobX,这就是store.items
本身。将其更改为如下所示:
store.items = [+new Date];
由于您没有在自动运行
回调中访问store.items[0]
,因此不会监视它的更改。(console.log
确实访问了它,但不是以MobX可以看到的方式访问的。)
如果您确实访问了store.items[0]
,将监视它的更改;如果向数组中添加或从中删除,则可能还需要显式访问length
:
autorun(() => {
store.filters;
store.items.length;
store.items.forEach(function() { } );
console.log('Update received');
});
我不熟悉mobx,但我只是将
store.items[0]
更改为store.items
,这很有效。我现在也不知道为什么在添加日期时使用=+
。也许您想将日期添加到数组中,在这种情况下,+=
中的语法与store.items
一起更改。@E.Sundin hi!+新日期
是新日期()的快捷方式代码>,以及关于执行不再是数组的store.items=+new Date
…酷的快捷方式!我的意思是附加到数组(store.items+=
)而不是仅仅更改它的内容,但我现在明白这不是解决问题的有效方法。@E.Sundin:仅供参考,+=
不会在JavaScript中向数组添加条目。@t.J.Crowder当然!愚蠢的我,我不知道我为什么这么想:)嗯。。。。好的,有趣!工作也是如此。MobX是否在分析自动运行中的代码以避免过多的回调?@Rikard:我还没有深入了解MobX的内部结构,但我不认为它在查看代码(当然希望没有)。我认为问题在于,console.log
通过绕过MobX监视的内部机制访问数组条目。关于我的问题,你解决了。非常感谢。现在我想知道为什么autorun(()=>console.log(store.items))代码>不被调用,但是自动运行(()=>console.log(store.items.length))代码>被调用,即使它没有更改,因为存储。项[0]=+新日期
没有更改该特定属性。。。但我想这超出了这个问题的范围:我问了一个问题,并提出了后续问题@丽卡:真奇怪。我不知道。:-)