当一个男人决定使用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的回调。

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

相关推荐
小雨cc5566ru3 小时前
uniapp+Android面向网络学习的时间管理工具软件 微信小程序
android·微信小程序·uni-app
万叶学编程3 小时前
Day02-JavaScript-Vue
前端·javascript·vue.js
bianshaopeng4 小时前
android 原生加载pdf
android·pdf
hhzz4 小时前
Linux Shell编程快速入门以及案例(Linux一键批量启动、停止、重启Jar包Shell脚本)
android·linux·jar
前端李易安5 小时前
Web常见的攻击方式及防御方法
前端
PythonFun5 小时前
Python技巧:如何避免数据输入类型错误
前端·python
知否技术5 小时前
为什么nodejs成为后端开发者的新宠?
前端·后端·node.js
hakesashou5 小时前
python交互式命令时如何清除
java·前端·python
天涯学馆5 小时前
Next.js与NextAuth:身份验证实践
前端·javascript·next.js