mobx 是如何实现它的魔力的
how does mobx achieve its magic
我很好奇 mobx 是如何工作的。
如果我有一个既是观察者又包含可观察对象的组件:
@observer
export default class Form extends Component {
@observable submitted = false;
@action.bound
submit() {
}
}
mobx 如何在不使用 setState 或使用 setState 的情况下导致重新渲染?
参见:https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254。 @observer
基本上是 autorun(() => this.render())
的 shorthand(它实际上有点复杂,但这就是它概念上的归结)
MobX 使用 Object.defineProperty()
将它自己的功能包装到赋值运算符中。当你写类似 form.submitted = false
的东西时,实际上会调用 MobX 方法。另见 https://twitter.com/dan_abramov/status/741633922694586368 and https://x-team.com/blog/es5-object-defineproperty-method/.
根据我的理解,mobx 在商店上定义了它的可观察属性,如下所示:
export const nameObservable = new Observable(observer => {
Object.defineProperty(customState, "firstName", {
get: function() {
return this._firstName.toUpperCase();
},
set: function(name) {
this._firstName = name;
observer.next(this._firstName);
}
});
});
// In your component
nameObservable.subscribe(render)
当您执行 customState.firstName = 'New name'
时,这将调用 属性 上的 set 方法,而 observer.next
将触发订阅此 属性 的所有方法...导致更新 UI.
要了解 mobx
的幕后工作原理,请查看 this repl。
我是从@mweststrate 的一个视频和某人的一篇学术论文中了解到的。这两个我都找不到了。
我很好奇 mobx 是如何工作的。
如果我有一个既是观察者又包含可观察对象的组件:
@observer
export default class Form extends Component {
@observable submitted = false;
@action.bound
submit() {
}
}
mobx 如何在不使用 setState 或使用 setState 的情况下导致重新渲染?
参见:https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254。 @observer
基本上是 autorun(() => this.render())
的 shorthand(它实际上有点复杂,但这就是它概念上的归结)
MobX 使用 Object.defineProperty()
将它自己的功能包装到赋值运算符中。当你写类似 form.submitted = false
的东西时,实际上会调用 MobX 方法。另见 https://twitter.com/dan_abramov/status/741633922694586368 and https://x-team.com/blog/es5-object-defineproperty-method/.
根据我的理解,mobx 在商店上定义了它的可观察属性,如下所示:
export const nameObservable = new Observable(observer => {
Object.defineProperty(customState, "firstName", {
get: function() {
return this._firstName.toUpperCase();
},
set: function(name) {
this._firstName = name;
observer.next(this._firstName);
}
});
});
// In your component
nameObservable.subscribe(render)
当您执行 customState.firstName = 'New name'
时,这将调用 属性 上的 set 方法,而 observer.next
将触发订阅此 属性 的所有方法...导致更新 UI.
要了解 mobx
的幕后工作原理,请查看 this repl。
我是从@mweststrate 的一个视频和某人的一篇学术论文中了解到的。这两个我都找不到了。