作为一个 iOS 开发,想必大家都经历过把很多状态和逻辑放到 Controller 当中的时候,当 Controller 逐渐变大,数据处理逻辑、视图展示逻辑和状态控制逻辑混在一起会导致代码越来越难维护,RN 当中的 State 也会存在这样的问题,我们引入 mobx 就是为了解决这样的问题。
MobX 是一个经过战火洗礼的库,它通过透明的函数响应式编程(transparently applying functional reactive programming - TFRP)使得状态管理变得简单和可扩展。
mobx 通过响应式的结构将数据和视图的处理逻辑进行分离,比较好的解决了状态维护的问题,再将数据处理分离出去就是一个标准的 MVVM 的结构,开发者在 VM 当中对数据和视图进行了绑定后就可以只关心视图的渲染和数据的处理了,这样也更容易理解。
mobx 的使用
使用前,首先我们要安装下
1 | npm install mobx --save |
然后是分别在数据绑定文件和视图文件当中中添加装饰器绑定,下面是部分示例代码
1 | //数据绑定文件 |
mobx 的绑定过程
mobx 在建立绑定时先将视图的 render()走一遍,收集视图和被观察数据的关联,并将这些关联储存起来。当数据源发生变化之后,mbox 就根据这些对应的关联,刷新对应的视图。
需要注意的是以下两种情况,对应的视图和关联不会被收集到:
1.赋值给属性的函数当中的关联不会在当前视图中收集
比如上面实例当中的 renderHeader 属性赋值的函数() => <Item data={this.store}></Item>,因为 Item 作为返回值返回,并不属于该视图当中的渲染。不过 store 当中的数据可以在 Item 当中的渲染中绑定,但需要你在 Item 中添加@observer.
2.直接使用被观察变量的值,未出现对应的引用
比如在 Item 当中添加了@observer,但是直接将被被观测变量的值赋值给了 Item 也是无法建立关联的,比如下面这种写法
1 | renderHeader={ |
这样被观测变量的值赋了过去,在 Item 的 render 当中并没有被观察变量引用,这样 mobx 认为是没有被观察数据使用的。正确的方法是像实例当中那样把被观测数据的父级引用传递过去,在 Item 当中使用父级引用来引用被观察变量来使用。
只要注意了以上两种情况,mobx 的绑定基本就没有什么大问题了,接下来就是享受 mobx 给你带来的便利了。
补充
绑定建立完成后,需要注意被观察的变量引用发生变化时必须是一个新值,指向一个新的地址,直接修改变量当中的值并不会让被观察变量的值发生变化,界面并不会刷新。
1 | class IndexStore { |