Mobx是一个状态管理库(状态管理实质上就是在管理数据变化)

Mobx通过透明的函数响应式编程使得状态管理变得简单和可扩展

Mobx状态管理是基于观察者模式的(Mobx6.0移除了修饰器)

安装Mobx

npm install mobx mobx-react --save

或者

yarn add mobx mobx-react --save

导入

import {observable, autorun, computed, action, makeObservable,reaction,when} from "mobx"
import {observer} from "mobx-react"

注意:在严格模式中,是不允许在action之外改变状态的

启动严格模式

import {configure} from 'mobx'
configure({enforceActions: true})

observable定义可观察的状态 action修改状态(动作) computed计算值

数据变化可被观察,例如:

let appdata = observable([1,2,3,4,5])
console.log(appdata[1])
appdata = observable({a:1,b:2,c:3})
console.log(appdata.a)
appdata.a += 1
console.log(appdata.a)
appdata = observable.box(100)
console.log(appdata)

响应式对象

makeObservable(手动配置observable,action,computed)

const store = makeObservable({    
    count: 666,    
    get double(){
        return this.count * 2
    },
    increment(){
        this.count += 1
    },
    decrement(){
        this.count -= 1
    },
},{
    count: observable, // 响应的属性
    double: computed, // 计算属性
    increment: action, // 修改状态
    decrement: action, // 修改状态
})

makeAutoObservable(自动配置observable,action,computed,全部自有属性都为observable,全部getters为computed,全部computed都为action)

const store = makeAutoObservable({  
    count: 666,
    get double(){
        return this.count*2
    },
    increment(){
        this.count+=1
    },
    decrement(){
        this.count-=1
    }
})

计算属性(observable.box)

let datas = observable.box(1000)
let dataa = observable.box(666)
let abc = computed(function(){
    return dataa + datas
})
console.log(abc.get())

操作状态(添加观察者,当状态发生变化,就会触发)

autorun(() => {
  appdata.datas = appdata.datas + 1
  console.log(appdata.datas)
})

监听数据变化(当store的状态发生改变,autorun方法就会被调用)

let xyz = observable({
  title: "hello world"
})
autorun(() => {
    console.log(xyz.title)
})
xyz.title = "hallo mobx"

当被观察数据被修改时,autorun()就会被触发

reaction监听

reaction(() => store.count,
    (a, b) => {
        // 当store.count修改就会被调用
        // 第一个值是当前值,第二个值为修改后的值
        console.log(a - b)
    }
)

when监听

when(() => store.count > 666, () => {
    console.log(store.count)
})
(async function() {
    // when还会返回一个promise
    await when(() => store.count > 666)
    console.log('store.count > 666')
})()

Mobx和Redux的比较:Redux通过限制数据的修改,Store中的数据是不可修改,只能通过action来修改,减少冗余。而Mobx就是通过自动更新来确保数据一致

mobx鼓励使用多个store仓库,而Redux鼓励一个应用使用一个Redux仓库