Mobx
mobx-react 工作原理:
-
observe组件会用 reactiveRender 重写render方法,reactiveRender 中的 reaction.track 建立与 observable 值的联系;
-
observe组件第一次渲染的时候,会创建Reaction,组件的render处于当前这个Reaction的上下文中,并通过track建立render中用到的observable建立关系;
-
当observable属性修改的时候,会触发onInvalidate方法,实际上就是组件的forceupdate,然后触发组件渲染,又回到了第一步
优化和最佳实践
- 使用transaction进行高级渲染性能优化;
- 延迟对象属性地解引用;
- 不要吝啬使用@observer,observer对性能的影响可以忽略不计,借助于精确的依赖分析,mobx可以得出组件对@observable变量(应用状态)的依赖图谱,对使用@observer进行标记的组件,实现精准的 shouldComponentUpdate 函数,保证组件100%无浪费渲染。
- 不要吝啬使用@action;action中封装了 transaction,对函数使用action修饰符后,无论函数中对 @observable 变量(应用状态)有多少次修改,都只会在函数执行完成后,触发一次对应的监听者;
observable
- createObservable(v, arg2, arg3)
- 第一个参数是 待监视对象,这个对象分为几种情况进行考虑:
- 对象, 如 {} , 判断方式 Object.getPrototypeOf(value) === Object.prototype || === null;
- 数组;Array.isArray
- ES6 的 Map,
- ES6 的 Set,
-
observable 上有对不同类型的监视对象的处理方法(这些方法定义在 observableFactories 对象上,再赋值到 observable 上);asCreateObservableOptions 处理 createObservable 的第二个参数,返回值赋值给 o;
-
如果 arg2 是未定义,返回默认的 defaultCreateObservableOptions;
// o
var defaultCreateObservableOptions = {
deep: true,
name: undefined,
defaultDecorator: undefined,
proxy: true
};
-
getDefaultDecoratorFromObjectOptions(o), deepDecorator = createDecoratorForEnhancer(deepEnhancer);
-
var base = extendObservable({}, undefined, undefined, o);asObservableObject();
-
var proxy = createDynamicObservableObject(base);
-
extendObservableObjectWithProperties(proxy, props, decorators, defaultDecorator);
-
asObservableObject
ObservableObjectAdministration(), addHiddenProp(), startBatch()
new Proxy(base, objectProxyTraps)
defaultDecorator decorator(target, key, descriptor, true)