MobX简介 #

什么是MobX? #

MobX 是一个简单、可扩展的状态管理库,通过透明的函数式响应式编程(TFRP)让状态管理变得简单直观。它遵循"任何源自应用状态的东西都应该自动地获得"的理念。

MobX的核心思想 #

MobX 的核心思想可以概括为一句话:当状态改变时,所有依赖该状态的东西都会自动更新

text
状态 (State) → 计算 (Computed) → 副作用 (Effects)
     ↓              ↓                ↓
  可观察状态      派生状态          自动响应

MobX的特点 #

1. 简单直观 #

MobX 的 API 设计简洁,学习曲线平缓:

javascript
import { makeAutoObservable } from 'mobx';

class Counter {
  count = 0;

  constructor() {
    makeAutoObservable(this);
  }

  increment() {
    this.count++;
  }

  decrement() {
    this.count--;
  }
}

2. 自动响应 #

当状态发生变化时,所有依赖该状态的组件会自动重新渲染:

javascript
import { observer } from 'mobx-react-lite';

const CounterView = observer(({ counter }) => (
  <div>
    <p>Count: {counter.count}</p>
    <button onClick={() => counter.increment()}>+1</button>
  </div>
));

3. 细粒度更新 #

MobX 只更新真正需要更新的组件,实现最优性能:

javascript
const UserView = observer(({ user }) => (
  <div>
    <p>Name: {user.name}</p>
    <p>Age: {user.age}</p>
  </div>
));

// 只有 name 变化时,才会重新渲染
user.name = 'New Name';

4. 可变数据 #

与 Redux 不同,MobX 允许直接修改状态:

javascript
// MobX - 直接修改
this.count++;

// Redux - 需要返回新对象
return { ...state, count: state.count + 1 };

MobX vs 其他状态管理方案 #

MobX vs Redux #

特性 MobX Redux
学习曲线
代码量
数据修改 可变 不可变
响应式 自动 手动订阅
调试 稍难 时间旅行
适用场景 中小型应用 大型应用

MobX vs Context API #

特性 MobX Context API
性能优化 自动 手动
状态更新 精确 整体重渲染
学习成本
功能丰富度

MobX的应用场景 #

适合使用MobX的场景 #

  1. 中小型应用:快速开发,代码简洁
  2. 复杂状态逻辑:需要频繁更新状态
  3. 实时应用:需要即时响应数据变化
  4. 表单密集型应用:复杂的表单状态管理

不太适合的场景 #

  1. 超大型应用:可能需要更严格的架构
  2. 需要时间旅行调试:Redux DevTools 更强大
  3. 团队不熟悉响应式:需要一定学习成本

MobX的工作原理 #

MobX 通过以下机制实现响应式:

text
┌─────────────────────────────────────────────┐
│                 Observable State            │
│              (可观察状态 - 被代理)            │
└─────────────────┬───────────────────────────┘
                  │
                  ▼
┌─────────────────────────────────────────────┐
│                Derivations                  │
│         (派生 - Computed / Reactions)        │
└─────────────────┬───────────────────────────┘
                  │
                  ▼
┌─────────────────────────────────────────────┐
│                 Reactions                   │
│      (反应 - autorun / observer组件)         │
└─────────────────────────────────────────────┘

1. 状态劫持 #

MobX 使用 Proxy 或 getter/setter 劫持对象属性:

javascript
const state = observable({
  count: 0
});

// 读取时自动追踪依赖
console.log(state.count);

// 写入时自动触发更新
state.count++;

2. 依赖收集 #

当读取状态时,MobX 自动收集依赖关系:

javascript
autorun(() => {
  // MobX 自动追踪 count 的依赖
  console.log(`Count is: ${state.count}`);
});

3. 自动更新 #

当状态变化时,自动触发相关依赖更新:

javascript
state.count++; // 自动触发 autorun 重新执行

MobX生态系统 #

核心库 #

  • mobx:核心状态管理库
  • mobx-react-lite:React 集成(函数组件推荐)
  • mobx-react:React 集成(类组件支持)

开发工具 #

  • mobx-devtools:浏览器开发工具
  • mst-middlewares:MobX State Tree 中间件

快速示例 #

下面是一个完整的计数器示例:

javascript
import { makeAutoObservable } from 'mobx';
import { observer } from 'mobx-react-lite';

// 1. 定义 Store
class CounterStore {
  count = 0;

  constructor() {
    makeAutoObservable(this);
  }

  increment = () => {
    this.count++;
  };

  decrement = () => {
    this.count--;
  };

  get double() {
    return this.count * 2;
  }
}

// 2. 创建实例
const counter = new CounterStore();

// 3. 创建组件
const Counter = observer(() => (
  <div>
    <p>Count: {counter.count}</p>
    <p>Double: {counter.double}</p>
    <button onClick={counter.increment}>+1</button>
    <button onClick={counter.decrement}>-1</button>
  </div>
));

总结 #

MobX 是一个强大而简单的状态管理解决方案,它通过响应式编程范式让状态管理变得直观。其主要优势包括:

  • 简单易学:API 简洁,概念清晰
  • 自动响应:状态变化自动触发更新
  • 高性能:细粒度更新,避免不必要的渲染
  • 可变数据:直接修改状态,代码更简洁

继续学习 MobX安装,开始搭建你的 MobX 开发环境。

最后更新:2026-03-28