状态管理之 Flux、Redux、Vuex、MobX(概念篇)

Redux/Mobx面试题汇总 [Redux/Mobx] redux和flux的区别是什么? [Redux/Mobx] 在redux中,什么是store? 阅读详情

状态管理之 Flux、Redux、Vuex、MobX(概念篇)

本文是对 Flux、Redux、Vuex、MobX 几种常用状态管理模式的总结,偏向于概念层面,不涉及过多代码。
状态管理
什么是状态管理?

状态管理就是,把组件之间需要共享的状态抽取出来,遵循特定的约定,统一来管理,让状态的变化可以预测。

为什么需要状态管理?
状态共享
组件之间通常会有一些共享的状态,在 Vue 或者 React 中我们一般会将这部分状态提升至公共父组件的 props 中,由父组件来统一管理共享的状态,状态的改变也是由父组件执行并向下传递。这样会导致两个问题:

需要将共享的状态提升至公共的父组件,若无公共的父组件,往往需要自行构造
状态由父组件自上而下逐层传递,若组件层级过多,数据传递会变得很冗杂

变化跟踪
在应用调试过程中,可能会有跟踪状态变化过程的需求,方便对某些应用场景的复现和回溯。这时候就需要统一对状态进行管理,并遵循特定的约定去变更状态,从而让状态的变化可预测。
Store 模式
Store 模式是一种相对简单的状态管理模式,一般有以下约定:

状态存储在外部变量 store 里(也可以是全局变量)
store 中的 state 用于存储数据,由 store 实例维护
store 中的 actions 封装了改变 state 的逻辑

流程图如下:

在这里插入图片描述
如果对 state 的变更均通过 actions,那么实现记录变更、保存快照、历史回滚就会很简单,但是 Store 模式并没有对此进行强制约束。
Flux
Flux 是一种架构思想,类似于 MVC 、MVVM 等。
Flux 的组成
Flux 把一个应用分成四部分:

View:视图层
Action:动作,即数据改变的消息对象(可通过事件触发、测试用例触发等)

Store 的改变只能通过 Action
具体 Action 的处理逻辑一般放在 Store 里
Action 对象包含 type (类型)与 payload (传递参数)

Dispatcher:派发器,接收 Actions ,发给所有的 Store
Store:数据层,存放应用状态与更新状态的方法,一旦发生变动,就提醒 Views 更新页面
在这里插入图片描述

Notice:

Action 本质上是一个纯声明式的数据结构,仅提供对事件的描述,不提供事件的具体逻辑。通常会给 Action 的 type 属性赋值一个大写的字符串,表明是常量,增强可维护性,例如:

{
type: ‘ADD_USER’,
payload: {
name: ‘user_name’
}
}
复制代码Flux 的特点

单向数据流。视图事件或者外部测试用例发出 Action ,经由 Dispatcher 派发给 Store ,Store 会触发相应的方法更新数据、更新视图
Store 可以有多个
Store 不仅存放数据,还封装了处理数据的方法

Redux
Redux 的组成

Store:存储应用的状态 – state 以及用于触发 state 更新的 dispatch 方法等,整个应用仅有单一的 Store。Store 中提供了几个管理 state 的 API:

store.getState():获取当前 state
store.dispatch(action):触发 state 改变(唯一途径)
store.subscribe(listener):设置 state 变化的监听函数(若把视图更新函数作为 listener 传入,则可触发视图自动渲染)

Action:同 Flux ,Action 是用于更新 state 的消息对象,由 View 发出

有专门生成 Action 的 Action Creator,其本质上是一个返回 Action 对象的函数

Reducer:是一个根据 action.type 更新 state 并返回 nextState 替换原来的 state 的同步的纯函数(对于相同的参数返回相同的返回结果,不修改参数,不依赖外部变量)。即通过应用状态与 Action 推导出新的 state:(previousState, action) => newState。Reducer 返回一个新的 state

整体流程为:Action Creator => action => store.dispatch(action) => reducer(state, action) => state = nextState。流程图如下:
在这里插入图片描述
Middleware
Redux 还支持中间件,用于管理异步数据流。
Redux 的 Middleware 是对 store.dispatch() 进行了封装之后的方法,可以使 dispatch 传递 action 以外的函数或者 promise;通过 applyMiddleware 方法应用中间件。(middleware 链中的最后一个 middleware 开始 dispatch action 时,这个 action 必须是一个普通对象)
常用库:redux-actions, redux-thunk, redux-promise 。
const store = createStore(
reducer,
// 依次执行
applyMiddleware(thunk, promise, logger)
)
复制代码Redux 的特点

单向数据流。View 发出 Action (store.dispatch(action)),Store 调用 Reducer 计算出新的 state ,若 state 产生变化,则调用监听函数重新渲染 View (store.subscribe(render))
单一数据源,只有一个 Store
state 是只读的,每次状态更新之后只能返回一个新的 state
没有 Dispatcher ,而是在 Store 中集成了 dispatch 方法,store.dispatch() 是 View 发出 Action 的唯一途径
支持使用中间件(Middleware)管理异步数据流

Vuex
Vuex 是 Vue 的状态管理模式。
Vuex 的核心概念

Store:Vuex 采用单一状态树,每个应用仅有一个 Store 实例,在该实例下包含了 state, actions, mutations, getters, modules
State:Vuex 为单一数据源

可以通过 mapState 辅助函数将 state 作为计算属性访问,或者将通过 Store 将 state 注入全局之后使用 this.$store.state 访问
State 更新视图是通过 vue 的双向绑定机制实现的

Getter:Getter 的作用与 filters 有一些相似,可以将 State 进行过滤后输出
Mutation:Mutaion 是 vuex 中改变 State 的唯一途径(严格模式下),并且只能是同步操作。Vuex 中通过 store.commit() 调用 Mutation
Action:一些对 State 的异步操作可以放在 Action 中,并通过在 Action 提交 Mutaion 变更状态

Action 通过 store.dispatch() 方法触发
可以通过 mapActions 辅助函数将 vue 组件的 methods 映射成 store.dispatch 调用(需要先在根节点注入 store)

Module:当 Store 对象过于庞大时,可根据具体的业务需求分为多个 Module ,每个 Module 都具有自己的 state 、mutation 、action 、getter在这里插入图片描述

Vuex 的特点:

单向数据流。View 通过 store.dispatch() 调用 Action ,在 Action 执行完异步操作之后通过 store.commit() 调用 Mutation 更新 State ,通过 vue 的响应式机制进行视图更新
单一数据源,和 Redux 一样全局只有一个 Store 实例
只能应用于 Vue

MobX
MobX 背后的哲学是:

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

意思就是,当状态改变时,所有应用到状态的地方都会自动更新。
MobX 的核心概念

State:驱动应用的数据
Computed values:计算值。如果你想创建一个基于当前状态的值时,请使用 computed
Reactions:反应,当状态改变时自动发生
Actions:动作,用于改变 State
依赖收集(autoRun):MobX 中的数据以来基于观察者模式,通过 autoRun 方法添加观察者在这里插入图片描述

举个栗子:
const obj = observable({
a: 1,
b: 2
})

autoRun(() => {
console.log(obj.a)
})

obj.b = 3 // 什么都没有发生
obj.a = 2 // observe 函数的回调触发了,控制台输出:2
复制代码MobX 的特点

数据流流动不自然,只有用到的数据才会引发绑定,局部精确更新(细粒度控制)
没有时间回溯能力,因为数据只有一份引用
基于面向对象
往往是多个 Store
代码侵入性小
简单可扩展
大型项目使用 MobX 会使得代码难以维护

总结

Flux 、Redux 、Vuex 均为单向数据流
Redux 和 Vuex 是基于 Flux 的,Redux 较为泛用,Vuex 只能用于 vue
Flux 与 MobX 可以有多个 Store ,Redux 、Vuex 全局仅有一个 Store(单状态树)
Redux 、Vuex 适用于大型项目的状态管理,MobX 在大型项目中应用会使代码可维护性变差
Redux 中引入了中间件,主要解决异步带来的副作用,可通过约定完成许多复杂工作
MobX 是状态管理库中代码侵入性最小的之一,具有细粒度控制、简单可扩展等优势,但是没有时间回溯能力,一般适合应用于中小型项目中

参考:

www.ruanyifeng.com/blog/2016/0…
www.ruanyifeng.com/blog/2016/0…
zhuanlan.zhihu.com/p/53599723
vuex.vuejs.org/zh/
cn.redux.js.org/
cn.mobx.js.org/

作者:jeff_
链接:https://juejin.im/post/5de77800518825125503ec27
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

FOC控制必看:单/双/三电阻电流采样方案全对比(附NXP实战避坑指南) 本文深入对比了FOC控制中单电阻、双电阻和三电阻电流采样方案的优劣与适用场景,重点剖析了采样时序、窗口与ADC转换的工程挑战。针对NXP平台,提供了解决采样窗口过窄的实战方案与配置指南,帮助工程师根据成本与性能需求做出最优选择,并规避常见设计陷阱。 阅读详情

相关推荐

通用策略04丨ORB魔改框架+自适应动量过滤模板

1、该策略第一次尝试使用低通滤波器进行行情择时过滤,同样该方法也可以用于主进场逻辑。2、出场逻辑适用于趋势、隔日波段、高低开等行情结构,对于日线级别长度K线一定积极作用,因此大家可以根据该逻辑进行反向品种筛选。3、在资金管理方面,我注意到一个问题,以往都是按照复权价格计算,但是资金却没有复权,所以这里实际上这里应该将价格除权计算,如下图所示:由于各平台差异,回测绩效以TBQ版本为准!!!本策略仅作学习、交流使用,实盘交易盈亏投资者个人负责!!!

松鼠宽客的博客 1176

浅析前端状态管理Redux Mobx Vuex

写在前面 前端技术的发展日新月异,vue,react,angular等的兴起,为我们带来了新的开发体验。但随着技术的革新,以及前端页面复杂度的提升,对应有localStorage,eventBus,vuex,redux,mobx,rxjs等数据存储和管理的方案,所以觉得研究状态管理还是很有必要的。所以最近花了一些时间研究一下这方面的知识。在分析的过程当中可能有自己理解出偏差或者大家有理解不一样的...

大灰狼的小绵羊哥哥的博客 1446

mac搭建ios自动化环境之WebDriverAgent配置

一、WebDriverAgent 1、简单介绍: WebDriverAgent是facebook为苹果公司开发的一款自动化测试工具,github上有下载资源;另外appium安装后也会自动安装自带的WebDriverAgent;可以用自带的,也可以从github下载并替换自带的; 2、不同appium版本自带WebDriverAgent默认路径不同 1)appium 1.10.1之前版本: npm方式安装: /usr/local/lib/node_modules/appium/node_modules/a

qq_30237715的博客 2761

前端状态管理与有限状态机

使用状态去影响视图,而 Action 主要负责完成状态间的变更。代码如何更好的构建其核心在于使用最合理的状态去管理界面,并用最合理的动作去实现状态间的变更。所谓的状态管理,实际上就是使用有限状态机来管理前端状态。有限状态机对 JavaScript 的意义在于,很多对象可以写成有限状态机。页面有几种状态(初始化状态?成功状态?失败状态?出错状态?描述这些状态需要什么参数。在什么时候转变状态,需要改变哪些部分。然后跟着思路,完成数据与 UI 部分。xstate。

2401_83127745的博客 1225

VSCode 降低适用版本并且关闭自动更新

官方表示,提高了远程服务器构建工具链的最低要求,更新了对 glibc 的要求,需要最低2.28版本。最快的方法是把vs code的版本降到1.85(为什么是这个版本呢?打开VS Code的官方网站(https://code.visualstudio.com/)通过查看可以知道,具体的版本没有直接显示分类,他是根据发布日期来分类的同时和版本匹配。在网站的顶部导航栏中找到”Updates”按钮,点击进入下载页面。找了半天一直没发现,原来就在紧挨着的下面。远程主机不满足运行vs code服务器的先决条件。

Sunflower的博客 9581

从萤石云到GB28181:海康4G摄像机接入第三方平台的曲折之路

本文深入探讨了海康4G摄像机接入第三方平台时遇到的协议冲突问题,特别是GB28181与萤石云服务的互斥性。通过技术分析揭示了4G模块的定向流量限制和协议栈资源竞争等核心问题,并提供了有线接入测试和萤石云API二次开发等解决方案。最后总结了设备选型的关键参数和协议兼容性检查清单,为安防监控系统集成提供实用指导。

mango的博客 993

FLUX模型,或许这几点你还未曾都了解,最详细的Flux模型介绍(附模型安装包)

在FLUX的工作流中使用满血版或半血版,区别在于模型的选择和CLIP加载器的选择,如果你的ComfyUI中没有相应的可选想或节点,那么大概率是你需要更新你的ComfyUI本体了。半血版,则是将主模型改为fp8的,权重类型为fp8的,clip1也改为fp8的t5模型,出图快,效果不会逊色多少于满血版的。

2401_84830464的博客 1万+

【水下小目标检测】SWIPENet与样本重加权:应对模糊与噪声的深度学习策略

本文深入探讨了水下小目标检测的挑战与解决方案,重点介绍了SWIPENet网络架构与IMA样本重加权算法。通过空洞卷积模块、特征金字塔重构和多尺度预测机制,SWIPENet有效提升了模糊目标的检测精度。结合Invert Multi-Class Adaboost算法,系统性地解决了水下环境中的样本不均衡问题,在URPC数据集上实现了48.8%的mAP,特别适合海洋生物检测等应用场景。

weixin_29057163的博客 344

前端状态管理:Vuex、Flux、Redux、MobX概念篇

Vuex Flux Redux MobX 的对比

u012764358的博客 2175

YOLOv11改进 | 损失函数改进篇 | EIoU、SIoU、WIoU、DIoU、FocusIoU等二十余种损失函数

这篇文章介绍了YOLOv11的重大改进,特别是在损失函数方面的创新。它不仅包括了多种IoU损失函数的改进和变体,如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU,还融合了“Focus”思想,创造了一系列新的损失函数。这些组合形式的损失函数超过了二十余种,每种都针对特定的目标检测挑战进行优化。文章会详细探讨这些损失函数如何提高YOLOv11在各种检测任务中的性能,包括提升精度、加快收敛速度和增强模型对复杂场景的适应性。

Snu77的博客 6193

6、硬件工程师笔试面试知识器件篇——电容(2025版本)

本文系统介绍了电容器的基本原理、类型分类、应用场景及相关设计问题。首先阐述了电容的定义、工作原理及计算公式,详细分析了陶瓷、电解、薄膜、钽等不同类型电容的特性差异。针对高频电路设计,重点讨论了如何评估和优化电容器的寄生效应(ESR/ESL)、频率特性、温度特性等关键参数。文章还提供了PCB布局优化策略,包括缩短走线、多层板设计、去耦网络配置等方法。最后涵盖了电容器寿命计算、稳定性评估及电源电路设计中的纹波电流处理等实用内容,为硬件工程师提供了全面的电容器选型和应用指南。

XU157303764的博客 3869

以购物车shop-cart为例,对比分析vuex/redux/mobx在前端状态管理上的异同

带

1455

竞赛经验——挑战杯、互联网加、北斗杯、微软创新杯、计算机设计等比赛教训与经验

最近参加一些比赛,北斗杯、挑战者杯、微软创新杯等比赛,每次比赛都有不少需要总结的地方,特别是项目展示上技巧很多,总结一下。 首先最重要的是作品自身硬!自身的作品完成度不高,或者是没有创新点,就没必要参加了。 比如是出去比赛的话,我反正每次碰到最多的是智慧农场、智慧家居之类,不知道为啥这种的太多了。如果是创业型比赛,评委基本会问小米已经做得很好了很便宜了,你的优势在哪里?这些都是常见的问题提前要...

沉迷单车的追风少年 7325

Vuex、Flux、Redux、Redux-saga、Dva、MobX

这篇文章试着聊明白这一堆看起来挺复杂的东西。在聊之前,大家要始终记得一句话:一切前端概念,都是纸老虎。 不管是Vue,还是 React,都需要管理状态(state),比如组件之间都有共享状态的需要。什么是共享状态?比如一个组件需要使用另一个组件的状态,或者一个组件需要改变另一个组件的状态,都是共享状态。 父子组件之间,兄弟组件之间共享状态,往往需要写很多没有必要的代码,比如把状态提升到父组件里...

大灰狼的小绵羊哥哥的博客 665

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

js 操作vuex数据_Flux、Redux、Vuex、MobX 总结-概念篇

Flux、Redux、Vuex、MobX 是常用的状态管理模式,本文是对这几个模式的一些总结。FluxFlux 是一种架构思想,类似于 MVC 、MVVM 等。Flux 的组成View: 视图层。Action: 动作,即数据改变的消息对象(可通过事件触发、测试用例触发等)。Store 的改变只能通过 Action。具体 Action 的处理逻辑一般放在 Store 里。Action 对象包含 ty...

weixin_29353947的博客 189

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

redux异步action_JS核心理论之《Redux、Vuex、Mobx状态管理》

近年来,SPA单页应用越来越多,前端工作的复杂度也在直线上升。前端页面上展示的信息越来越多也越来越复杂,页面组件变得臃肿,组件间的通信成本增高,数据流向变得模糊。因此需要一个系统的状态管理方案。状态管理的解决思路就是:把组件之间需要共享的状态抽取出来,遵循特定的约定,统一来管理,让状态的变化可以预测。Flux、Redux、Vuex、MobX 是常用的状态管理模式。FluxFlux 的核心思想:数据...

weixin_31556371的博客 183

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

mobx中跟新了数据视图没变化_JS核心理论之《Redux、Vuex、Mobx状态管理》

近年来,SPA单页应用越来越多,前端工作的复杂度也在直线上升。前端页面上展示的信息越来越多也越来越复杂,页面组件变得臃肿,组件间的通信成本增高,数据流向变得模糊。因此需要一个系统的状态管理方案。状态管理的解决思路就是:把组件之间需要共享的状态抽取出来,遵循特定的约定,统一来管理,让状态的变化可以预测。Flux、Redux、Vuex、MobX 是常用的状态管理模式。FluxFlux 的核心思想:数据...

weixin_39566387的博客 268

[JS][深度]Vuex、Flux、Redux、Redux-saga、Dva、MobX 都干了些什么

Vuex、Flux、Redux、Redux-saga、Dva、MobX javascriptreact.jsvue.jsreduxmobx 发布于 2018-12-18约 65 分钟 这篇文章试着聊明白这一堆看起来挺复杂的东西。在聊之前,大家要始终记得一句话:一切前端概念,都是纸老虎。 不管是Vue,还是 React,都需要管理状态(state),比如组件之间都有共享状态的需要。什么...

weixin_42338584的博客 310

vue 状态管理 Vuex、Flux , redux总结

原文链接: vue 状态管理 Vuex、Flux , redux总结 ...

阿豪 228

Java集合框架核心解析与实战应用

Java集合框架是处理对象集合的核心API,采用接口与实现分离的设计理念,提供List、Set、Queue和Map等数据结构。其底层实现涉及数组、链表、哈希表等数据结构,通过合理的集合选型可以显著提升系统性能。在并发场景下,ConcurrentHashMap等线程安全集合解决了多线程访问问题。Java8引入的Stream API和Lambda表达式极大简化了集合操作,而最新版本持续优化集合性能与易用性。实际开发中,集合类型选择、初始化大小设置以及避免装箱拆箱等都是性能优化的关键点。电商系统、缓存设计等典型应

diaoju3333的博客 318

一文梭穿Vuex、Flux、Redux、Redux-saga、Dva、MobX

不管是Vue,还是 React,都需要管理状态(state),比如组件之间都有共享状态的需要。什么是共享状态?比如一个组件需要使用另一个组件的状态,或者一个组件需要改变另一个组件的状态,都是共享状态。 父子组件之间,兄弟组件之间共享状态,往往需要写很多没有必要的代码,比如把状态提升到父组件里,或者给兄弟组件写一个父组件,听听就觉得挺啰嗦。 如果不对状态进行有效的管理,状态在什么时候,由于什么原因,如何变化就会不受控制,就很难跟踪和测试了。如果没有经历过这方面的困扰,可以简单理解为会搞得很乱就对了。 在软件开

陈皮糖的博客 311

React中的一个状态管理工具—Flux

Flux出现的原因 Flux的出现和传统MVC有关,因为传统的MVC架构没有解决,M和V之间的交互关系 为了弥补这个缺陷,人们相处了 Flux Redux Mobx 这样三种架构思维 , 那么React只是这三种架构的一个组成部分,那么这个组成部分充当的是 View( 视图 ) 注意: Flux Redux Mobx 和 MVC 是同一级别的,相比之下, vuex级别要小的多 ,但是他们解决的都是多组件状态共享 问题:我想在Redux中使用vue , 可以吗? 可以的 Flux.

纸飞机博客 1596
上一篇: 浏览器缓存汇总
下一篇: JavaScript 函数的特性与原型链讲解
妄想编程
博客等级 码龄8年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值