Skip to main content

Mobx与Redux的区别

一、状态容器介绍

1.redux

https://blog-zwj.oss-cn-beijing.aliyuncs.com/20200526/reudx.png

  1. 首先,用户发出 Action

    store.dispatch(action);
  2. 然后,Store 自动调用 Reducer,并且传入两个参数:当前 State 和收到的 Action。 Reducer 会返回新的 State

    let nextState = todoApp(previousState, action);
  3. State 一旦有变化,Store 就会调用监听函数

    //设置监听函数
    store.subscribe(listener);
  4. listener 可以通过 store.getState()得到当前状态。如果使用的是 React,这时可以触发重新渲染 View

    function listerner() {
    let newState = store.getState();
    component.setState(newState);
    }

2. Mobx

https://blog-zwj.oss-cn-beijing.aliyuncs.com/20200526/mobx.png

  1. actions 是唯一能够改变 state 的方法。

  2. state 是最基础的数据,它不应该包含冗余的和派生的数据。

  3. computed values 派生值是通过纯函数从 state 中派生而来的。当派生值依赖的状态发生变化了,Mobx 将会自动更新派生值。如果依赖的状态没有改变,mobx 会做优化处理。

  4. reactions 也是派生数据,是从 state 中派生而来的。它的副作用是自动更新 UI。(注:mobx 有一个 reaction 接口,当 state 改变时,就会调用它的回调。UI 是通过 reaction 更新的。)

二、couter 计算示例

reudx

https://blog-zwj.oss-cn-beijing.aliyuncs.com/20200526/counter-redux.png

mobx

https://blog-zwj.oss-cn-beijing.aliyuncs.com/20200526/counter-mobx.png

三、关注点不同

Redux

更多的是遵循 Flux 模式的一种实现,是一个 JavaScript 库,它的关注点在于:

  1. Action:一个 JavaScript 对象,描述动作相关信息,主要包含 type 属性和 payload 属性:
    • type:action 类型
    • payload:负载数据
  2. Reducer:定义应用状态如何响应不同动作(action),如何更新状态
  3. Store:管理 action 和 reducer 及其关系的对象,主要提供以下功能:
    • 维护应用状态并支持读取访问状态(getState())
    • 支持监听 action 的分发,更新状态(dispatch(action))
    • 支持订阅 store 的变更(subscribe(listener))
    • 支持通过中间件(redux-thunk、redux-saga、redux-promise 等)处理异步任务流程

mobx

Mobx 是一个透明函数响应式编程的状态管理库,它使得状态管理简单可伸缩,它的关注点在于:

  1. Action:定义改变状态的动作函数,包括如何变更状态
  2. Store:集中管理模块状态(State)和动作(action)
  3. Derivation(衍生):从应用状态中派生而出,且没有任何其他影响的数据,我们称为 derivation(衍生),衍生在以下情况下存在:
    • 用户界面
    • 衍生数据, 衍生主要有两种:
      1. Computed Values(计算值):计算值总是可以使用纯函数(pure function)从当前可观察状态中获取
      2. Reactions(反应):反应指状态变更时需要自动发生的副作用,这种需要实现其读写操作

四、 函数式和面向对象(设计思想的不同)

  • Redux 更多的是遵循函数式编程(Functional Programming, FP)思想,而 Mobx 则更多从面相对象角度考虑问题。
  • Redux 提倡编写函数式代码,如 reducer 就是一个纯函数(pure function)纯函数,接受输入,然后输出结果,除此之外不会有任何影响,也包括不会影响接收的参数;对于相同的输入总是输出相同的结果。 Mobx 设计更多偏向于面向对象编程(OOP)和响应式编程(Reactive Programming),通常将状态包装成可观察对象,于是我们就可以使用可观察对象的所有能力,一旦状态对象变更,就能自动获得更新。

五、 单一 Store 和多 Store(对 store 管理的不同)

Store 是应用管理数据的地方,在 Redux 应用中,我们总是将所有共享的应用数据集中在一个大的 store 中,而 Mbox 则通常按模块将应用状态划分,在多个独立的 store 中管理

六、 JavaScript 对象和可观察对象

  • Redux 默认以 JavaScript 原生对象形式存储数据,而 Mbox 使用可观察对象
  • Redux 需要手动追踪所有状态对象的变更 Mobx 中可以监听可观察对象,当其变更时将自动触发监听

七、 不可变(Immutable)和可变(Mutable)(数据可变性的不同)

  • Redux 状态对象通常是不可变的(Immutable):我们不能直接操作状态对象,而总是在原来状态对象基础上返回一个新的状态对象,这样就能很方便的返回应用上一状态;而 Mobx 中可以直接使用新值更新状态对象。