Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MobX自动运行只开火一次_Javascript_Reactjs_Mobx - Fatal编程技术网

Javascript 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

我正在学习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 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]=+新日期
没有更改该特定属性。。。但我想这超出了这个问题的范围:我问了一个问题,并提出了后续问题@丽卡:真奇怪。我不知道。:-)