Redux和Reflux研究
来源:互联网 发布:云计算工程师做什么 编辑:程序博客网 时间:2024/06/08 18:27
写在前面
在开始全新的
React
项目前,先好好研究一下React
两个典型的“轮子”,Reflux和Redux。两者没有明确的优劣之分,只是对初学者来说Reflux
容易理解,而Redux
的单一state
在项目开发中非常好用,所以你可能发现Github
上Redux
的星星比Reflux
略多些吧。但是见智者见智,两者其实都是社区同仁智慧的结晶。
Redux
先谈谈对Redux
的理解。
独特性
第一
一个数据层的framework
,类似于Baobab
。比其好的一点,引入middleware
体系,有几个现成的插件redux-thunk
, redux-promise
,不用但心异步请求的事。虽然说灵活、独立很重要,但全局设计也是 让人放心去用,而不用担心功能缺失和其它风险。
第二
应用了FP中数据不可变性(immutable),这让追踪数据改变过程有很大提升。也就是其宣扬的时间旅行。这对复杂问题定位是有好处的。
第三
树形化数据存储,reducer
的返回即是其新建,更新、删除过程,树形结构不需要预先定义。同时,reducer
也是纯函数,与reactor
的render
是纯函数呼应。
第四
强约束(约定),增加了内聚合性。Flux
中的action
, dispatcher
, store
比较散,在分层架构是需要的,但内聚性不佳,出现java
的仪式感。而Redux
是数据层很清晰,一个store
,更新则dispatch
到action
,前半段自己想怎么搞就怎么搞(middleware
),后半段reducer
。reducer
约束是不要改oldState
,返回newStatew
,做到immutable
。
第五
不一样的action
:Redux
中的action
会切得很细,一个传统的Action
被切成了三个Action
:Loading
, GetSuccess
, GetError
。所以,从这个方面来看Action
服务于UI,而非业务逻辑单元。
第六 Redux
大量应用FP,经常遇到FP中的curry
, trund
, promise
这些概念,学习成本较高。在middleware
层实现,对没有FP经验的人讲不友好。
置Redux于上下文中
Redux
是一个比较薄的数据层。同时,把View同步刷新也做了(redux-react
)。
在传统MVC中,还是有一个controller
来做业务逻辑。但Redux
硬生生的把一个controller
切成二部分:action
, reducer
。
理论上,Redux
还可以把React
组件中的state
的存储也拿过来,比如用户搜索的名称。这样,就可以把过滤算法放到selector
中去。但这样好处并不是很大。
对比其他方案
与Baobab
对比,两者都是数据管理框架,Baobab
提供cursor
来方便你对很深层的数据结构进行update
。而Redux
是通过selector
函数来做,这种方法会比较晦涩。但比Baobab
好的地方,做数据fetch
可以通过Redux
的middleware
来完成。
与Rails
的controller
, ActionRecord
相比,Redux
更多是一种约定,不提供路由级的controller
,不提供数据访问cursor
。
Redux
接口不超过10个,代码也非常少,但是与之前的MVC框架完全不同。可能最大的问题是没有和react-route
打通,在工程化时让人迷茫。
挑战
Redux
应用最大的挑战更多来自设计层面,如何设计action
,设计state
树形结构。我们只能通过非常少的线索(FP架构思想)去做,这对没有FP经验的团队是一个大挑战。
通过selector
函数从stat
树里取数据比较晦涩,并且这个selector
里的代码认为是业务逻辑,单独放在selector
,业务上不内聚。
middleware
层设计:action
是一个意图(intent),发送给middleware
,让其来实现此意图。但这样做,action
比有两义性,一会儿是对象,一会儿是函数。同时FP编程侵入性太大。
没有与Route
结合起来设计,让人很不放心,也不知道如何在不同路由下来做数据与组件的connect
。
OO与FP编程范式对决
react + redux是一种典型的FP编程范式实现,而其它框架大多是OO范式。是否选用react+redux开发,需要看是否对FP有掌握或者有一定的架构能力。但单独用react则没有这种要求,当个view来用。
FP优缺点
FP的好处是没有OO的复杂仪式感,是沿着数据结构+算法的思路进行抽象和结构化。如果顶层设计做好,代码复用度极高,代码量少。比如要生成一颗树我用迭归算法直接生成,而OO的人往往会用一个Composite模式去定义一个晦涩的类接口。
FP的缺点也是也是面向过程编程的缺点,算法与数据全局化、并且互相耦合,这往往会导致一个强耦合的系统。如果没有做好顶层设计,是难以演进的。
通过约定和全局的理解,可以减少FP的一些缺点。“约定大于配置”也是框架的主要发展方向。
OO优缺点
OO的好处是分而治之,增量演进。同时有自闭性,语义比较清晰。
缺点是在表达一些算法时,反而是很困难的。如command模式实现历史回滚就挺麻烦。也这是四人帮的设计模式大多比较难以理解的原因。另外,OO一直有一个对算法复用的问题,ruby语言解决比较好,用mixin很自然。而像C++就用多继承和泛型,个人感觉并不是最好的。
建议
有FP经验的或者架构能力比较强,团队人员比较少、能力强,较强适合用react+redux
。不然用react+angluar
, 或直接用vue
。而且过度的OO,搞太多java
仪式感确实没有必要。通过架构设计,FP在生产力有着一定的优势。同时对付复杂系统,能更好调测、定位问题。在新时代下,值得尝试。
Reflux 和 Redux
已经认识了Redux
,而相比较Redux
而言,Reflux
没有reducer
的概念,取而代之,和action
做基友的是store
。Reflux
的功能流程如下:
组件就是用户界面,actions就是组件的动作,store用于执行actions的命令,并返回一个state对象给组件。组件通过state来更新界面。
而Redux的流程如下:
state就是数据,组件就是数据的呈现形式,action是动作,action是通过reducer来更新state的。
Reflux没有把状态的一部分值绑定在组件的props
上,而是将状态绑定在组件的state
上,请看 react dev tool
的截图:
Reflux
可以直接调用action
的方法,而Redux
必须将方法绑定在组件的props
上,或者使用props
的dispatch
方法来执行actions
的方法。
@参考 百草赵斌
《深入理解React、Redux》
@参考 天可
《react+relux入门教程》
- Redux和Reflux研究
- flux | fecebookflux | reflux | redux 都是些啥
- Reflux
- Reflux
- Redux, Redux thunk 和 React Redux 源码阅读
- React和Redux的连接react-redux
- React和Redux的连接react-redux
- React和Redux的连接react-redux
- React和Redux的连接react-redux
- React和Redux的连接react-redux
- React和Redux的连接react-redux
- React和Redux的连接react-redux
- Redux和React
- Redux基本原理和使用
- React Reflux
- ReFlux详解
- Reflux详解
- Reflux详解
- Linux 进程间通信
- android genymotion下载地址
- 秒杀系统架构分析与实战
- TextView文字旋转
- 关于SpringMvc中使用aop的问题
- Redux和Reflux研究
- Android错误记录—— No such file or directory (2)
- 约瑟夫环---数学公式求解
- iOS 关于IMP指针的作用
- 京东咚咚架构演进
- Data Binding 指南
- setEdgesForExtendedLayout
- java中new关键字和c++中的new有什么区别
- redis数据结构指南:开篇