MobX和hashmap更新不会触发自动运行

时间:2018-04-02 16:27:47

标签: javascript mobx

我试图更新类Test的_users hashmap,以及两个" strange"事情正在发生(我是一个MobX新手):

  1. MobX,即使启用了严格模式,也允许我更新_users,即使它是可观察的并且addUser()不是@action
  2. 自动运行只执行一次,而我希望它能运行三次
  3. 如果我将this._users = {}置于addUser()内,则事情按预期工作:MobX告诉我将addUser定义为动作,并且多次触发自动运行。但这仅用于测试,我不需要每次都重置hashmap

    我应该如何更新_users让MobX触发事件?

    代码如下

    import { useStrict, configure, autorun } from 'mobx';
    import { observable, action, computed } from 'mobx';
    
    
    configure({ enforceActions: true });
    
    
    class Test {
        @observable _users = {};
        userCount = 0;
    
        addUser() {
            this._users[this.userCount++] = 0;
        }
    
    }
    
    var t = new Test();
    
    autorun(function test () {
        console.log("users: ", t._users);
    });
    
    t.addUser();
    t.addUser();
    t.addUser();
    
    console.log("users: ", (Object.keys(t._users)).length); // print users: 3
    

1 个答案:

答案 0 :(得分:0)

要自动运行(以及一般观察者),您必须访问被观察对象的属性。只有那个阅读(解除引用)才会告诉mobx要观察什么。你没有在自动运行功能中执行此操作,因此autorun在再次运行autorun时无法获取。

因此,在您的情况下,您必须阅读至少一个观察对象的道具。所以我建议你做以下事情:

import { useStrict, configure, autorun } from 'mobx';
import { observable, action, computed } from 'mobx';


configure({ enforceActions: true });


class Test {
    @observable _userStore = { users: {} };
    userCount = 0;

    addUser() {
        this._userStore.users[this.userCount++] = 0;
    }

}

var t = new Test();

autorun(function test () {
    console.log("users: ", t._userStore.users); // Here we are reading a prop of userStore
});

t.addUser();
t.addUser();
t.addUser();

console.log("users: ", (Object.keys(t._userStore.users)).length); // print users: 3

<强>参考文献: