Skip to content

状态管理介绍

在目前前端的组件化开发风潮中,无论是 PC 端还是移动端,对于组件化来讲有一个非常重要的就是状态管理。要理解什么状态管理,首先就要理解什么是状态。

实际上,状态的概念非常简单,就是每个组件自身可以维护一些数据。而由于组件与组件之间存在一些关系(例如父子关系、兄弟关系),这就避免不了组件之间要进行数据的传递,这也就是所谓的组件状态管理出现的背景。

image-20220627103352425

如果使用传统的 porps 或者自定义事件的形式来传递组件的数据,就会显得非常的繁琐,一个组件状态更新,需要一层一层传递到根组件,再由根组件一层一层往下传递。这样一个应用的组件层数嵌套得越深,工作量就会变得越大。

在这样的背景下,专门用于状态管理的库就出现了。

image-20220627105559707

状态管理库的核心思想很简单,专门拿一个 store 的仓库来管理所有组件的状态,假如一个组件状态更新后,同步更新仓库中的状态,这样另一个组件再获取最新的状态时,也不用向之前那样层层传递,直接从仓库获取最近的状态即可。

目前,市面上比较流行的状态管理库有:

Flux#

2013 年,Facebook 亮出 React 的时候,也跟着带出了 FluxFacebook 认为两者相辅相成,结合在一起才能构建大型的 JavaScript 应用。

Flux 的组成:

image-20220627105617920

Flux 的特点:

Vuex#

VuexVue 官方推出的状态管理库。

Vuex 的核心概念:

image-20220627105636282

Vuex 的特点:

Redux#

作为一款针对 JavaScript 应用的可预测状态管理容器库,由 Dan Abramov2015 年创建的 Redux 在创建之初曾受到 Flux 架构以及函数式 Elm 的启发。后来,随着 Dan Abramov 加盟 FacebookRedux 最终成为 Facebook 旗下的一个子项目。Redux 之所以被广泛接受,是因为 Redux 融合了各家技术于一身,不但简化了 Flux 的流程与开发方式,还引入了一些优秀的设计理念。

作为一个应用状态管理库,ReduxFlux 有很多相似的地方。不同之处在于,Flux 可以有很多个改变应用状态的 Store,并可以通过事件来触发状态的变化,组件可以通过订阅这些事件来和当前状态保持同步。

Redux 中,则并没有 Dispatcher(分发器)的概念,Redux 使用一个单独的常量状态树来保存整个应用的状态,并且这个对象是不能直接被改变的。如果某些数据发生改变,那么就会创建出一个新的对象。

由于 Redux 是在 Flux 的基础上扩展出的一种单向数据流的实现,所以数据的流向、变化都能得到清晰的控制,并且能很好地划分业务逻辑和视图逻辑。

Redux 的组成:

image-20220627110106329

Redux 的特点:

Mobx#

作为一个应用状态管理库,Redux 被广泛用于复杂的大型应用中,在很多大型 Web 前端应用中都可以看到它的身影。不过除了 Redux,社区里近年来还有另一产品呼声很高,那就是 Mobx

MobX 是由 Mendix、CoinbaseFacebook 开源的状态管理框架。MobX 背后的哲学是:

任何源自应用状态的东西都应该自动地获得。

意思就是,当状态改变时,所有应用到状态的地方都会自动更新。它通过响应式函数编程来实现状态的存储和管理。受到面向对象编程和响应式编程的影响,Mobx 可以将状态包装成可观察对象,通过观察和修改对象的状态进而实现视图的更新。

这样一个功能强大,上手非常容易的状态管理工具。就连 Redux 的作者也曾经向大家推荐过它,在不少情况下你的确可以使用 Mobx 来替代掉 Redux

MobX 的核心概念:

image-20220627110125184

MobX 的特点:

最后总结一下: