前言
使用一种工具就像使用一个包装好的黑盒子,我们不必探究其内部到底是如何实现,只需要能够将用法了然于胸,什么样的输入会得到什么样的输出能有完美的预测。但不幸的事,大部分文档都难以让自己达到这点,为此我们不得不浅析一下源码,来探寻他是如何实现的,避免出现意料之外的情况导致bug,也防止做出多余的操作,精简代码,减少bug。
自动追踪依赖
在使用redux的时候,我们不得不使用connect来从store中取到当前组件所需要的state,这其实也是一个依赖分析的问题,只有当组件所依赖的state变化时,当前组件才会更新,避免了不必要的render。而在使用mobx时,这一步被自动完成了,因此在使用mobx时,会感到极其酸爽舒适,只需要一个@observer就能尽情地使用store中的state了,而且完全不用担心性能问题,那么这究竟是如何做到的?
了解mobx机制
在探究mobx-react的源码之前,得先了解一下mobx。
mobx在observable改造了{ num: 0 }
这个对象为可观察对象,当取obj的属性num时,能会执行其内部的方法。
reaction的track方法传进去的回调中,执行console.log('reaction init', obj.num)
时,get到了obj.num值,这时mobx会将这个属性作为依赖与此reaction绑定,当obj.num变化时,就会执行实例化reaction时传进去进去的回调
这时会输出track num++ 1,并从新确定依赖关系。接下来看下一个例子
由此可见,mobx可以在每次执行时会分析依赖,并且将在callback中,却并不执行的属性排除在依赖外,减少了callback。
看到这里,我们应该能想到,只要将callback当成react的render,就能完美地解决对react的对接,并且比使用redux的时候性能更好!因为使用redux的时候将依赖num,letter,bool三个属性,无论哪个改变都讲触发组件的render,除非根据业务逻辑写上复杂的componentShouldUpdate,而使用mobx时,只要其中某个state的改变不影响view的改变时,这个state的变化就不会引起组件render,达到更细粒度上对render的控制,近乎完美地排除不需要的render。
mobx-react源码片段探究
那么接下来看一看mobx-react的源码是如何实现的
|
|
这样就达到了用mobx控制react组件的render。
结论
对这一段代码我们可以知道,仅仅在组件上加一行@observer然后使用mobx的可观察属性进行render控制view,就能达到性能的高效化,对单个state属性的粒度上控制组件的render,所以放心大胆地用mobx来管理应用的state吧!
下一篇 分批处理变化