背景:
面试被问到mobx 原理 虽然平时react有写mobx 但是还真没研究过原理。所以此次面试被GG
mobx 如何实现组件外状态-> 渲染(data ->view)
重要的两个依赖包:
mobx
mobx-react
要实现数据驱动视图必须使用到以上两个依赖包
过程大致分为两部:(下文以class 组件为例)【mobx v6.6.2】
-
数据与组件建立关联关系
-
数据修改 触发件建update
问题1: 数据与组件建立关联关系
答:通过两个包装器 (@observer,@observable)和一个globalState 建立了联系。 如下图:
关键源码:
问题2:数据修改如何驱动组件更新
答:上述建立关联关系时通过 value 的 get 方式 做的,那么触发更新是通过 value set 方式做的。如下图
关键源码如下:
以上流程部分只是针对class 组件 ,mobx 中 区分了class 和function
observer --》》 mobx-react -
|---makeClassComponentObserver() 类组件
|---observerLite() 函数组件
但是 原理都是一样的。
PS:
ObservableValue 只是最基础的数据类型,针对于 array map set 等 mobx 类似于vue 一样 重写了他们的属性方法 达到监控数据变化。所以mobx 5.0+ 也做了类似于vue3 的改动 ,引入proxy 达到复杂数据的change 监控.