# MobX 简介

# Mobx 介绍

官方文档

简单,可扩展的状态管理库。

MobX 是由 Mendix,Coinbase(比特币公司),Facebook 开源和众多个人赞助商所赞助的。

MobX 和 Redux 做的事情是一样的,都是通过一个对象去管理应用程序中的状态。

但是和 Redux 相比,MobX 又及其简单,因为它没有过多的流程和样板代码。

  • 流程
    • Redux 要求必须严格遵守它的工作流程,例如通过 dispatch 触发 action,由 store 接收到 action,然后交给 reducer 去处理 action
    • MobX 没有过多的流程要求
      • 直接调用定义的 action 方法修改状态
      • 直接访问 Store 中的状态
  • 样板代码
    • Redux 需要编写很多样板代码,例如编写 action。不过它也提供了一些方法来减少样板代码,例如 使用 bindActionCreators 生成 action
    • MobX 无样板代码
      • 直接定义状态和修改状态的方法

关于二者之间如何选择可以阅读:Redux vs MobX in React: Which is right for you? | Tabnine Blog

# 版本介绍

当前最新版本为 6,版本 4 和 版本 5 已不再支持。

在 MobX 6 之前的版本推荐使用装饰器语法,而 MobX 6 不推荐使用装饰器语法。

因为它不是 ES 标准,并且标准化过程要花费很长时间,如果要使用可以通过配置启用装饰器语法。

React 可以使用工具修改配置:react-app-rewired customize-cra

配置插件支持装饰器语法:@babel/plugin-proposal-decorators

MobX 可以运行在任何支持 ES5 的环境中,包括浏览器和 Node(例如服务端渲染应用)。

MobX 一开始是和 React 配合使用的,React 负责渲染应用的状态,MobX 负责管理应用状态供 React 使用。

但是随着发展,现在它也可以在 AngularJS 和 Vue 等框架中使用。

# MobX 和 Redux 应用场景

  • 项目团队
    • 开发者的风格不同,如果团队中开发者比较多,推荐使用 Redux
    • 因为 Redux 有严格的工作流程以及样板代码,从而可以约束每个人的代码风格
    • Redux 在多人或多个项目中共享状态比较方便
  • 个人开发
    • 个人负责的项目或人数交少的,推荐使用 MobX
    • 因为 MobX 代码简约无样板代码,相比 Redux 开发效率会高一些

# 核心概念

  • Observable State:被 MobX 跟踪的状态
  • Action:允许修改状态的方法,在严格模式下只有 Action 方法允许修改状态
    • 此 Action 和 Redux 中的 Action 不同
    • Redux 中的 Action 是一个包含 type 属性的对象
    • MobX 中的 Action 是一个函数
  • Computed Values:计算值,根据应用程序状态派生的新值,类似 Vue 的计算属性
    • 它是一个 get 方法(作为属性使用)

MobX 对于不符合要求的代码不会报错,只会发出 Warning 警告,提示开发者编写符合要求的代码,例如使用非 Action 方法修改状态并不会影响程序运行。

# 工作流程

在这里插入图片描述

  • 在视图中通过事件 event 触发 Action 方法
  • Action 方法用于更新(update)状态(Observable State)
  • 当状态(Observable State)发生变化,就会通知(notify)计算值(Computed Values)
  • 当计算值(Computed Values)同步完成完,就会触发(trigger)副作用(Side-effects)
    • 例如 render 更新视图

具体操作:

  • 直接在一个 class 中创建状态和修改状态的方法
  • 调用 makeAutoObservable 方法将状态和方法转化为 MobX 工作流的状态和方法
  • 使用这个 class 创建 store 对象
  • 将 store 作为属性传递给组件
  • 然后使用 observer 高阶组件包装组件监听状态