当一个男人决定使用Mobx(一)

背景

随着RN项目在工程中的落地,一些RN项目不仅仅是简单的弹窗展示,里面可能存在较为复杂的逻辑和交互,随着业务复杂度的提升,一些问题也出现了,比如如何进行跨组件间的通信,如何进行状态管理,如何约束团队成员的代码编写,保证后续开发质量并且拉齐团队成员开发共识,这些问题的出现其实在传统的hook也是可以解决的,但是开发成本大,代码丑陋,团队成员的共识也不太一致,围绕状态管理这个核心(因为RN是通过状态进行驱动改变UI的),后续进行一系列的架构和研发规则的调整是后续的一个规划,考虑到团队成员的接收程度,目前初步选择简单易上手的mobx作为状态管理框架。

mobx简介

MobX 是一个身经百战的库,它通过运用透明的函数式响应编程(Transparent Functional Reactive Programming,TFRP)使状态管理变得简单和可扩展。它有些类似Android中的LiveData,通过使用观察者模式和代理模式,当数据变化时,重新触发监听者的回调。

mobx使用demo

js 复制代码
import { makeAutoObservable, autorun } from "mobx"

class Animal {
    name
    energyLevel

    constructor(name) {
        this.name = name
        this.energyLevel = 100
        makeObservable(this, {
            name: observable,
            energyLevel: observable,
            reduceEnergy: action,
            isHungry: computed,
        });
    }

    reduceEnergy() {
        this.energyLevel -= 10
    }

    get isHungry() {
        return this.energyLevel < 50
    }
}

const giraffe = new Animal("Gary")

autorun(() => {
    console.log("Energy level:", giraffe.energyLevel)
})

autorun(() => {
    if (giraffe.isHungry) {
        console.log("Now I'm hungry!")
    } else {
        console.log("I'm not hungry!")
    }
})

console.log("Now let's change state!")
for (let i = 0; i < 10; i++) {
    giraffe.reduceEnergy()
}

上面的代码是mobx官方文档上使用react的demo,流程上分为两部分

1.定义一个可观测状态

上面的Animal就是一个状态,其中的secondsPassed是一个可观测属性。其中secondPass为对象的key值,observable为具体对象。

2.注册一个观察

上面的autorun函数传进来的回调就是一个观察者函数,当Animal中的name更新时,会自动触发autoreturn中函数的重新执行。

核心类型

数据更新流程

上面的Animal,在调用makeObservable后会创建一个ObservableObjectAdministration,并且会作为一个隐藏属性挂在Animal对象上,之后会调用ObservableObjectAdministration的defineObservableProperty_,这里会对Animal中的每个属性创建一个ObservableValue,并且劫持对应属性的set和get方法。autorun会创建一个reaction,创建后会执行trackDerivedFunction,执行autorun中传入的方法(一般就是组件的渲染),当组件使用其中的状态属性时,会调用Observable的get方法,会调用reportObserved方法,将reaction中的newObserving_中添加当前ObservableValue,之后会调用bindDependencies方法,将当前reaction注册到ObservableValue,reaction其实就可以理解为观察者模式中的观察者。

之后属性更改的时候,因为ObservableObjectAdministration的属性劫持,会调用ObservableObjectAdministration中的setObservablePropValue_,获取到对应属性的ObservableValue,调用它的setNewValue_方法,setNewValue_方法会调用propagateChange方法,然后再次触发reaction的schedule_方法,调用其中传入的方法,触发UI重新刷新。

总结

整体来说Mobx是一个使用代理模式 (劫持属性的设置和获取)与观察者模式相结合的一个状态管理工具,每个属性都会追踪对应reaction,当数据更新时,触发reaction的回调。

关注我的公众号:'滑板上的老砒霜'

相关推荐
一枚小小程序员哈1 小时前
基于Android的随身小管家APP的设计与实现/基于SSM框架的财务管理系统/android Studio/java/原生开发
android·ide·android studio
百万蹄蹄向前冲1 小时前
Trae分析Phaser.js游戏《洋葱头捡星星》
前端·游戏开发·trae
stevenzqzq2 小时前
android data 文件夹作用
android
2501_915918412 小时前
iOS 应用上架全流程实践,从开发内测到正式发布的多工具组合方案
android·ios·小程序·https·uni-app·iphone·webview
朝阳5812 小时前
在浏览器端使用 xml2js 遇到的报错及解决方法
前端
GIS之路2 小时前
GeoTools 读取影像元数据
前端
ssshooter3 小时前
VSCode 自带的 TS 版本可能跟项目TS 版本不一样
前端·面试·typescript
Jerry3 小时前
Jetpack Compose 中的状态
前端
dae bal4 小时前
关于RSA和AES加密
前端·vue.js
柳杉4 小时前
使用three.js搭建3d隧道监测-2
前端·javascript·数据可视化