MobX:从 observable.map() 引用对象
MobX: references to objects from an observable.map()
在使用 MobX 的 observable.map() 时,我发现存储在地图中的对象不再链接到原始对象:
import { useStrict, configure, autorun } from 'mobx';
import { observable, action, computed } from 'mobx';
configure({ enforceActions: true });
let user = {id: 1, name: "John"};
let myMap = observable.map();
myMap.set(user.id, user);
user.name = "Bill";
console.log(myMap.get(1).name); // John is printed, I expect Bill
如何获得与普通动态对象相同的行为? IE。有没有一种方法可以根据以前存在的引用更新 observable.maps 内的对象?
user = {id: 1, name: "John"};
let myClassicMap = {};
myClassicMap[user.id] = user;
user.name = "Bill";
console.log(myClassicMap[1].name); // Bill is printed as expected
编辑
使用 observable.map(values, { deep: false })
我得到了通常的行为,但我不明白我是否在可观察性方面失去了一些东西。在下面的示例中,自动运行不是由 user.name 的更改触发的,不是吗?
import { observable, autorun} from 'mobx';
let myMap = observable.map({}, {deep: false});
myMap.set(user.id, user);
autorun(() => console.log(myMap));
user.name = "Bill";
这是因为每当你向深数组中添加一些东西时,你放入其中的所有内容也会 wrapped/turned 进入 observable:
let user = {id: 1, name: "John"};
let myMap = observable.map();
myMap.set(user.id, user); //here user is turned into observeable object where all curent keys are tracked
如果你不深入:{deep: false}
那么这个对象将不会 wrapped/turned 成为可观察对象,因此你所做的任何更改都是可见的,但这些更改不会被跟踪到数组本身。因此不会触发任何 re-render.
还要确保在 action()
中执行所有操作,因为您启用了 configure({ enforceActions: true });
:
import { useStrict, configure, autorun } from 'mobx';
import { observable, action, computed } from 'mobx';
configure({ enforceActions: true });
let user = {id: 1, name: "John"};
let myMap = observable.map();
action(() =>{
myMap.set(user.id, user);
user = myMap.get(1); //here we retrieved the observable object version of user.
user.name = "Bill";
})()
console.log(myMap.get(1).name)
在使用 MobX 的 observable.map() 时,我发现存储在地图中的对象不再链接到原始对象:
import { useStrict, configure, autorun } from 'mobx';
import { observable, action, computed } from 'mobx';
configure({ enforceActions: true });
let user = {id: 1, name: "John"};
let myMap = observable.map();
myMap.set(user.id, user);
user.name = "Bill";
console.log(myMap.get(1).name); // John is printed, I expect Bill
如何获得与普通动态对象相同的行为? IE。有没有一种方法可以根据以前存在的引用更新 observable.maps 内的对象?
user = {id: 1, name: "John"};
let myClassicMap = {};
myClassicMap[user.id] = user;
user.name = "Bill";
console.log(myClassicMap[1].name); // Bill is printed as expected
编辑
使用 observable.map(values, { deep: false })
我得到了通常的行为,但我不明白我是否在可观察性方面失去了一些东西。在下面的示例中,自动运行不是由 user.name 的更改触发的,不是吗?
import { observable, autorun} from 'mobx';
let myMap = observable.map({}, {deep: false});
myMap.set(user.id, user);
autorun(() => console.log(myMap));
user.name = "Bill";
这是因为每当你向深数组中添加一些东西时,你放入其中的所有内容也会 wrapped/turned 进入 observable:
let user = {id: 1, name: "John"};
let myMap = observable.map();
myMap.set(user.id, user); //here user is turned into observeable object where all curent keys are tracked
如果你不深入:{deep: false}
那么这个对象将不会 wrapped/turned 成为可观察对象,因此你所做的任何更改都是可见的,但这些更改不会被跟踪到数组本身。因此不会触发任何 re-render.
还要确保在 action()
中执行所有操作,因为您启用了 configure({ enforceActions: true });
:
import { useStrict, configure, autorun } from 'mobx';
import { observable, action, computed } from 'mobx';
configure({ enforceActions: true });
let user = {id: 1, name: "John"};
let myMap = observable.map();
action(() =>{
myMap.set(user.id, user);
user = myMap.get(1); //here we retrieved the observable object version of user.
user.name = "Bill";
})()
console.log(myMap.get(1).name)