MobX or Redux ? #81

简介: MobX or Redux ? #81

前言


在过去的项目中一直用的都是 Redux,觉得挺不错的,按照官方推荐的一些写法,再加上团队风格,打造了一套关于 Redux 的架构,但是,现在觉得写 ActionReducer 太繁琐,随着业务不断的增量,相应的文件和代码也会不断的增加,而且对新人来说不是非常友好(理解 Redux 比较困难),听说一方诸侯 MobX 非常不错,所以在尝试使用了,目前项目中两套架构都是并存,写下自己的一些感想。


都解决什么问题?


1、组件之间复用状态非常困难

React 本身没有提供将可复用性状态“附加”到组件的途径(例如,把组件连接到 Store)。如果你使用过 React 一段时间,你也许会熟悉一些解决此类问题的方案,比如 PropsHOC。但是这类方案需要重新组织你的组件结构,这可能会很麻烦,使你的代码难以理解。写下这片博客的时候,React 已提供 Hook,但是本人觉得这都是些 hack 方案。

2、复杂组件变得难以理解

我们经常维护一些组件,组件起初很简单,但是逐渐会被状态逻辑和副作用充斥。每个生命周期常常包含一些不相关的逻辑。例如,组件常常在 componentDidMountcomponentDidUpdate 中获取数据。但是,同一个 componentDidMount 中可能也包含很多其它的逻辑,如设置事件监听,而之后需在 componentWillUnmount 中清除。相互关联且需要对照修改的代码被进行了拆分,而完全不相关的代码却在同一个方法中组合在一起。如此很容易产生 BUG,并且导致逻辑不一致。

在多数情况下,不可能将组件拆分为更小的粒度,因为状态逻辑无处不在。


Redux


ReduxFlux 演变而来,但受 Elm 的启发,避开了 Flux 的复杂性。它主要有以下三个核心概念:

1、Actions

一个 JavaScript 对象,描述发生的动作,主要包含 typepayload 两个属性。

payload 可以是普通的数据或是函数。

const GET_LIST = 'getList';
return {
    type: GET_LIST,
    payload: api.getList(params)
};

2、Reducer

定义应用状态如何响应不同动作(Action),如何更新状态;

switch (action.type) {
  case GET_LIST:
    return Object.assign({}, state, { list: action.payload.result });
  default:
    retur state;
}

3、Store

const initialState = {
    orderListData: {}
};

存储组件的数据,主要提供以下功能:

3.1. 维护应用状态并支持访问状态(getState());

3.2. 支持监听 Action 的分发,更新状态(dispatch(action));

3.3. 支持订阅 Store 的变更(subscribe(listener));

4、异步流

由于 Redux 所有对 Store 状态的变更,都应该通过 Action 触发,异步任务(通常都是业务或获取数据任务)也不例外,而为了不将业务或数据相关的任务混入 React 组件中,就需要使用其他框架配合管理异步任务流程,如 redux-thunkredux-sagaredux-promise

5、数据流向


优点

1、流程规范,按照官方推荐的规范和结合团队风格打造一套属于自己的流程。

2、函数式编程,在 Reducer 中,接受输入,然后输出,不会有副作用发生,幂等性。

3、可追踪性,很容易追踪产生 BUG 的原因。

缺点

1、流畅太繁琐,需要写各种 ActionReducer

2、要想完成异步数据,得配合其他库。


MobX


MobX 是一个经过战火洗礼的库,它通过透明的函数响应式编程(transparently applying functional reactive programming - TFRP)使得状态管理变得简单和可扩展。其中核心概念也非常简单,主要有以下几个:

1、Store

使用 observable 很像把对象的属性变成 Excel 的单元格。 但和单元格不同的是,这些值不只是原始值,还可以是引用值,比如对象和数组。

import { observable } from "mobx";
class Todo {
    @observable title = '';
}

2、Computed values

当添加了一个新的 todo 或者某个 todofinished 属性发生变化时,MobX 会确保 unfinishedTodoCount 自动更新。 像这样的计算可以类似于 MS Excel 这样电子表格程序中的公式。每当只有在需要它们的时候,它们才会自动更新。

class TodoList {
    @observable todos = [];
    @computed get unfinishedTodoCount() {
        return this.todos.filter(todo => !todo.finished).length;
    }
}

3、Reactions

Reactions 和计算值很像,但它不是产生一个新的值,而是会产生一些副作用,比如打印到控制台、网络请求、递增地更新 React 组件树以修补 DOM、等等。

autorun(() => {
    console.log("Tasks left: " + todos.unfinishedTodoCount)
})

4、Actions

描述要发生的动作

class TodoList {
    @observable title = '';
    @action
    changeTitle() {
        this.title = 'test';
    }
}

5、异步流

MobX 不需要额外配置另外的库。

6、数据流向


优点

1、学习成本少,基础知识非常简单,跟 Vue 一样的核心原理,响应式编程。

2、写更少的代码,完成更多的事。不会跟 Redux 一样写非常多的样板代码。

3、使组件更加颗粒化拆分。


缺点

1、过于自由,MobX 提供的约定及模版代码很少,如果团队不做一些约定,容易导致团队代码风格不统一。

2、可拓展,可维护性,也许你会担心 Mobx 能不能适应后期项目发展壮大呢?确实 Mobx 更适合用在中小型项目中,但这并不表示其不能支撑大型项目,关键在于大型项目通常需要特别注意可拓展性,可维护性,相比而言,规范的 Redux 更有优势,而 Mobx 更自由,需要我们自己制定一些规则来确保项目后期拓展,维护难易程度;


案例


Redux 项目模板

MobX 项目模板


总结


对于 Redux 更规范,更靠谱,应该使用 ReduxRedux 模版太多,太复杂了,应该选择 Mobx 这类推断,我们都应该避免,也应该要避免这些,这些都是相对而言,每个框架和库都有各自的实现,特色,及其适用场景,正如 Redux 流程更复杂,但熟悉流程后就更能把握它的一些基础/核心理念,使用起来可能更有心得及感悟;而 Mobx 简单化,把大部分东西隐藏起来,如果不去特别研究就不能接触到它的核心/基本思想,也许使得开发者一直停留在使用层次。

所以无论是技术栈还是框架类库,并没有绝对的比较我们就应该选择什么,抛弃什么,我们应该更关注它们解决什么问题,它们解决问题的关注点,或者说实现方式是什么,它们的优缺点还有什么,哪一个更适合当前项目,以及项目未来发展。


参考资料


1、你需要 Mobx 还是 Redux?

2、MobX

3、React

4、Redux

目录
相关文章
|
3月前
|
运维 安全 数据安全/隐私保护
语音钓鱼中转窝点运作机理与全链条防控研究 —— 基于韩国仁川警方案例
本文以2026年韩国仁川破获的语音钓鱼中转窝点案为样本,系统剖析“招募—运维—拨号—洗钱”黑产链条,揭示一次性手机与冒用SIM卡的技术滥用逻辑,构建涵盖号码核验、设备检测、语义识别、资金监测的四维防控模型,并提供可落地的Python检测代码,提出源头严控、全链监管、跨部门协同的闭环治理方案。(239字)
182 0
|
设计模式 开发者 Python
Python中循环依赖问题及其解决方案
循环依赖是 Python 开发中需要特别注意的问题。通过重新设计模块结构、延迟导入、依赖注入、利用 Python 的动态特性以及代码重构等方法,可以有效地解决循环依赖问题。这些策略不仅有助于提高代码的可维护性和可读性,还能避免潜在的运行时错误。在实际开发中,开发者应该根据具体情况选择合适的解决方案。
|
Oracle Java 关系型数据库
Elastic Stack 兼容性之 ES 与 JDK:JDK版本兼容性及版本推荐
Elastic Stack 兼容性之 ES 与 JDK:JDK版本兼容性及版本推荐
|
文字识别 API 开发工具
印刷文字识别使用问题之如何进行私有化部署
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
算法 C++
c++循环
c++循环
460 0
|
机器学习/深度学习 算法 Windows
算法的复杂性分析
算法的复杂性分析
709 0
算法的复杂性分析
|
编译器 开发工具 C语言
FFmpeg开发笔记(一):ffmpeg介绍、windows开发环境搭建(mingw和msvc,无需源码编译)
FFmpeg开发笔记(一):ffmpeg介绍、windows开发环境搭建(mingw和msvc,无需源码编译)
FFmpeg开发笔记(一):ffmpeg介绍、windows开发环境搭建(mingw和msvc,无需源码编译)
|
传感器 自然语言处理 运维
技术详解 阿里云AIoT物模型支撑设备规模已超亿级
本文介绍的物模型技术,对于阿里云AIoT来说,物模型技术早已沉淀多年,所以能够让各种硬件产品实现真正的智能化连接。
2091 1
技术详解 阿里云AIoT物模型支撑设备规模已超亿级
|
前端开发 JavaScript 开发者
为什么我们正在放弃 CSS-in-JS
这篇文章将深入的挖掘我当时为什么会在项目中使用 CSS-in-JS (本文使用 Emotion 方案 ),而现在为什么正在放弃这样的方案。
313 0