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

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

相关推荐
天生我材必有用_吴用5 小时前
Vue3 + VitePress 搭建组件库文档平台(结合 Element Plus 与 Arco Design Vue)—— 超详细图文教程
前端
liu****5 小时前
基于websocket的多用户网页五子棋(八)
服务器·前端·javascript·数据库·c++·websocket·个人开发
San305 小时前
深入理解 JavaScript 函数:从基础到高阶应用
前端·javascript·node.js
ttyyttemo5 小时前
Column,rememberScrollState,记住滚动位置
前端
芒果茶叶6 小时前
并行SSR,SSR并行加载
前端·javascript·架构
vortex56 小时前
解决 Kali 中 Firefox 下载语言包和插件速度慢的问题:配置国内镜像加速
前端·firefox·腾讯云
修仙的人6 小时前
Rust + WebAssembly 实战!别再听说,学会使用!
前端·rust
maxine6 小时前
JS Entry和 HTML Entry
前端
用户63310776123666 小时前
Who is a Promise?
前端
比老马还六7 小时前
Blockly元组积木开发
前端