mvc 事务层切换数据源_Mvc 与 Flux 与 Redux的一些思考

975da51f19a96609fe640dbc56e421f2.png

MVC模型 解决问题以及不足

  1. 解决问题

为了解决业务逻辑和界面渲染逻混在一起

1a1b9c14e9b83873b51c434156b6578f.png
MVC流程图

2. 不足

由于 Model 对外直接暴露了 set 和 on 方法,导致 View 层可以随意改变 Model 中的值,也可以随意监听 Model 中值的变化。这样的设定最终会导致一个庞大的 Model 中 某个字段变化后,可能触发无数个 change 事件。在这些 change 事件的回调中,可能还有新的 set方法调用,导致更多的 change 事件触发。

861d1470f7884171d55f5d87dd5094fa.png
MVC 的问题


FLUX模型解决问题以及不足

  1. 解决问题
  • 相对于完全只使用 React实现项目: 应用的状态数据只存在于 React组件之中, 每个组件都要维护驱动自己 渲染的状态数据,单个组件的状态还好维护,但是如果多个 组件之间的状态有关联,那就麻烦了。 比如子组件和父组件,父组件需要维护所有 子组件计数值的总和, 子组件和 父分别维护自己的 状态,如何同步 父 和 子 状态就成了问题, React 只提供了 props 方法让组件之间通信,组件之间关系稍微复杂一点,这种方式就显得非常笨拙。
  • 相对于MVC数据模型: 解决MVC模型数据流混乱的形态,实行较为严格的 ‘单向数据流’的管理方式,MVC 最大的问题就是无法禁绝 View 和 Model 之 间的直接对话,对应于 MVC 中 View 就是 Flux 中的 View,对应于 MVC 中的 Model 的就 是 Flux 中的 Store,在 Flux 中, Store 只有 get方法,没有 set方法,根本可能直接去修改 其内部状态, View 只能通过 get方法获取 Store 的状态,无法直接去修改状态,如果 View 想要修改 Store状态的话,只有派发一个 action对象给 Dispatcher。

70740c5acbe18b7d1d4ecec3af3a12ec.png
Flux模型


2. 不足

  • Store之间存在明显依赖关系
    在 Flux的体系中,如果两个 Store之间有逻辑依赖关系,就必须用上 Dispatcher的 waitFor 函数。 父组件对 action类型的 处理,依赖于子组件已经处理过了。 所以,必须要通过waitFor函数告诉Dispatcher, 先让 子组件处理这些 action对象,只有 子组件搞定之后 父组件才 继续。
  • 难以进行服务器端渲染
    如果要在服务器端渲染,输出不是一个 DOM 树,而是一个字符串,准确来说 就是一个全是 HTML 的字符串 。 在 Flux 的体系中,有 一 个全局的 Dispatcher,然后每一个 Store 都是一个全局唯 一 的对象,这对于浏览器端应用完全没有问题,但是如果放在服务器端,就会有大问题 。和一个浏览器网页只服务于一个用户不同,在服务器端要同时接受很多用户的请求, 如果每个 Store都是全局唯一的对象,那不同请求的状态肯定就乱套了 。
  • Store 混杂了逻辑和状态
    Store 封装了数据和处理数据的逻辑,当我们需要动态替换一个 Store 的逻辑时,只能把这个 Store 整体替换掉,那也就无法保持 Store 中存储的状态 ,例如: 在开发模式下,开发人员要不停地对代码进行修改,如果 Store在某个状态下引发了 bug,如果能在不毁掉状态的情况下替换 Store 的逻辑,那就最好了,开发人员就可以不 断地改进逻辑来验证这个状态下 bug 是否被修复了 。
    Redux模型解决问题以及不足


1. 原则以及解决问题

  • 单一数据源
    在 Flux 中, 应用可以拥有多个 Store,往往根据功能把应用的状态 数据划分给若干个 Store 分别存储管理 。如果状态数据分散在多个 Store 中,容易造成数据冗余,这样数据一致性方面就会出 问题。 虽然利用 Dispatcher 的 waitFor方法可以保证多个 Store之间的更新顺序,但是这 又产生了不同 Store之间的显示依赖关系,这种依赖关系的存在增加了应用的复杂度,容 易带来新的问题 。 Redux 对这个问题的解决方法就是,整个应用只保持一个 Store,所有组件的数据源 就是这个 Store 上的状态 。 这个唯一 Store上的状态,是一个树形的对象,每个组件往往只是用树形对象上一部 分的数据 。
    Redux 和 Flux 之间最大的区别就是对 store/reducer 的抽象,Flux 中 store 是各自为战的,每个 store 只对对应的 controller-view 负责,每次更新都只通知对应的 controller-view;而 Redux 中各子 reducer 都是由根reducer统一管理的,每个子reducer的变化都要经过根reducer的整合

96158fb08b2ef7eb9223c4b74d1cc472.png
Flux 中的 store 流程图

d85ac8bbc8f253362714da327f9ad86c.png
Redux 中的 Reducer 流程图
  • 状态是只读的
    这一点和 Flux 的思想不谋而合,不同的是在 Flux 中,因为 store 没有 setter 而限制了我们直接修改应用状态的能力,而在 Redux 中,这样的限制被执行得更加彻底,因为我们压根没有 store。 在 Redux 中,我们并不会自己用代码来定义一个 store。取而代之的是,我们定义一个 reducer, 它的功能是根据当前触发的 action 对当前应用的状态(state)进行迭代,这里我们并没有直接修 改应用的状态,而是返回了一份全新的状态。 Redux 提供的 createStore 方法会根据 reducer 生成 store。最后,我们可以利用 store. dispatch 方法来达到修改状态的目的 。
  • 状态修改均由纯函数完成
    纯函数就是 Reducer, Redux 这个名 字 的前 三 个字母 Red 代表的就是 Reducer。 按照创作者DanAbramov的说法, Redux名字的含义是Reducer+Flux。 在 Redux 中,每个reducer 的函数 reducer(state , action), Flux 更新状态的函数只有一个参数 action,因为状态是由 Store 直接管理的,所以 处理函数中会看到代码直接更新 state 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机语言缺省,揭秘物联网必学语言——C语言与C++的区别

C语言虽说经常和C在一起被大家提起,但可千万不要以为它们是一个东西。有很多人会有这样的疑问:C语言和C有什么区别呢?C是在C语言的基础上发展来的,但是并不是C比C语言高级,两者的编程思想不一样,应用的领域…

C/C 语言printf()

1.调用格式为 printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符, 用来确定输出内容格式。参量表是需要输出的一…

公路多孔箱涵设计_【公路常识中篇】公路路基边坡滑坡防护设计和预防

【公路常识中篇】公路路基边坡滑坡防护设计和预防来源&#xff1a;网络 公路路基基本知识&#xff0e;内容包括&#xff1a;公路路床&#xff1b;公路路堤&#xff1b;公路路基压实&#xff1b;影响公路路基稳定因素&#xff1b;公路路堑&#xff1b;公路路基沉陷&#xff1b;公…

按照计算机系统结构分类存储器可分为,存储器分类,存储器的分级结构

描述1、存储器概述存储器是计算机系统中的记忆设备&#xff0c;用来存放程序和数据。构成存储器的存储介质&#xff0c;目前主要采用半导体器件和磁性材料。存储器中最小的存储单位就是一个双稳态半导体电路或一个CMOS晶体管或磁性材料的存储元&#xff0c;它可存储一个二进制代…

spark 流式计算_流式传输大数据:Storm,Spark和Samza

spark 流式计算有许多分布式计算系统可以实时或近实时处理大数据。 本文将从对三个Apache框架的简短描述开始&#xff0c;并试图对它们之间的某些相似之处和不同之处提供一个快速的高级概述。 阿帕奇风暴 在风暴 &#xff0c;你设计要求的T opology实时计算的图&#xff0c;然…

嵌入式开发C语言中的uint8_t

在嵌入式开发中的C语言代码中&#xff0c;经常可以看到类似uint8_t、uint16_t、uint32_t、uint64_t这种数据类型&#xff0c;在教材中却从来没见过。实际上这些数据类型都是某种数据类型的别名。比如&#xff0c;在定义函数时用到了uint8_t。右键“uint8_t”&#xff0c;单击“…

多模态语义分析_情感分析、多模态NLP、多语言翻译...这场NLP知识盛宴不可错过!...

AI科技评论按&#xff1a;2020年12月20日&#xff0c;由中国计算机学会自然语言处理专业委员会(CCF-NLP)发起&#xff0c;联合AI研习社及各个知名高校开展的“CCF-NLP走进高校”系列高校NLP研究分享报告会第六期——华中师范大学站&#xff0c;通过线上会议直播的方式进行。本期…

电瓶车续航测试软件,重点看续航 测试2020款蔚来ES8 485KM

时间回到2019年12月28日&#xff0c;一场隆重的“NIO DAY 2019”在深圳举行&#xff0c;2020款ES8便是在那场大秀中首次亮相。5个月之后&#xff0c;2020款蔚来ES8已于4月19日正式开始交付&#xff0c;我们也在交付之日对新车进行了试驾体验。所以今天就不多废话了&#xff0c;…

海盗云商插件_推销自己的海盗猫王运营商

海盗云商插件因此&#xff0c;Java没有Elvis运算符&#xff08;或者&#xff0c;更正式地讲&#xff0c;它没有null合并运算符或null安全成员选择&#xff09;……虽然我个人不太在意它&#xff0c;但有些人似乎很喜欢它。 当一位同事需要几天后&#xff0c;我坐下来探讨了我们…

英文期刊催稿信模板_手把手教你写投稿信,另附查尔斯沃思高质量模板

导语本文是查尔斯沃思作者服务关于学术论文写作系列文章的最后一篇&#xff0c;我们邀请英国编辑团队资深成员&#xff0c;根据其自身丰富的撰稿经验&#xff0c;为中国作者呈现系统全面的写作指导建议&#xff0c;我们将其翻译成中文&#xff0c;方便大家理解。希望本系列文章…

63权限提升-Linux脏牛内核漏洞SUID信息收集

今天讲到的方法是suid和内核漏洞 案例一Linux 提权自动化脚本利用-4 个脚本 两个信息收集&#xff1a;LinEnum、linuxprivchecker 两个漏洞探针&#xff1a;linux-exploit-suggester、linux-exploit-suggester2 信息收集有什么用&#xff1f; 信息收集就能判断能否进行s…

擦窗机器人不用时怎么收纳_省心省力,智能擦窗机器人

以前擦窗户&#xff0c;一手湿抹布一手干抹布&#xff0c;身边再放点儿报纸&#xff0c;可能还得再来一个人换洗抹布。一天下来&#xff0c;两个人都是腰酸背痛的。对于又爱干净又是懒癌星人的人来说&#xff0c;玻妞擦窗机器人&#xff0c;让大家不用爬上爬下&#xff0c;也能…

C语言变量定义和赋值

定义变量的格式非常简单&#xff0c;如下所示&#xff1a;数据类型 变量名;首先要强调的一点是&#xff1a;最后的分号千万不要丢了。变量的定义是一个语句&#xff0c;我们说过&#xff0c;语句都是以分号结尾的。“数据类型”表示想要存储什么类型的数据就定义什么类型的变量…

win7计算机盘共享,win7电脑如何共享文件夹 win7电脑共享文件夹操作方法

我们在工作当中&#xff0c;中是喜欢在电脑当中创建一个文件夹&#xff0c;然后把东西放进这个文件夹当中&#xff0c;最后实现共享&#xff0c;这样的方式能够为我们省去不少时间&#xff0c;那么win7电脑如何共享文件夹呢?今天为大家带来win7电脑共享文件夹的操作步骤。win7…

cdi-api_使用CDI简化JAX-RS缓存

cdi-api这篇文章&#xff08;通过一个简单的示例&#xff09;说明了如何使用CDI Producers使其在RESTful服务中利用缓存控制语义更加容易 与HTTP 1.0中可用的Expires标头相比&#xff0c; HTTP 1.1中添加了Cache-Control标头&#xff0c;这是急需的改进。 RESTful Web服务可以…

【C语言】结构体赋值

结构体在 C 程序中使用的较为频繁&#xff0c;能对数据有一定的封装的作用。对一个结构体赋值时&#xff0c;经常采用的方式是&#xff0c;分别对其成员变量赋值。那么能否将一个结构体用赋值号&#xff08;“”&#xff09;直接赋值给另一个结构体呢&#xff1f;网上的答案不一…

vue 传参 微信_vue-router 你可能忽略的知识点

vue-router相信大家都不陌生&#xff0c;并且很多都有实战经验。可能有很多你忽略的一些点。1、丑陋的hash值vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL&#xff0c;于是当 URL 改变时&#xff0c;页面不会重新加载。const router new VueRouter(…

适合计算机64位的cad,【1人回答】求一个能适用于CAD2008的纬地,我的电脑是Win7 64位的-3D溜溜网...

回答&#xff1a;下载方法&#xff1a;1、建立临时目录&#xff0c;如 CAD20082、下载AutoCAD2008安装软件&#xff0c;将文件复制到CAD2008目录下。3、将 CAD2008 文件夹中的 zh-cn 文件夹改名为 en-us&#xff1b;4、下载“AutoCAD 2008 64 位补丁包(下载地址&#xff1a;ACA…

C |格式化输出与变量类型

C语言 格式化输出与变量类型 1、格式化输出在PHP里面&#xff0c;我们一般都是用echo和var_dump以及print_r等来输出调试语句&#xff0c;在&#xff23;语言中一般用printf来输出&#xff0c;不过由有点特殊&#xff0c;你需要在输出的时候指定输出的数据类型&#xff1a;#in…

信工干货||C语言输入输出语句

数据输入与输出C语言无I/O语句&#xff0c;I/O操作由函数实现putchar( ) getchar( ) printf( ) scanf( ) puts( ) gets( )#include或#include “stdio.h”数据输出字符输出函数格式&#xff1a;putchar&#xff08;c&#xff09;参数&#xff1a;c为字符型或整型常量、变量或表…