Redux&RxJS,有什么相似之处?
我知道Redux是Flux的一个更好的“实现”,或者更好地说它是重新devise来简化事物(应用程序状态pipe理)。
我听过很多关于响应式编程(RxJS)的知识,但是我还没有深入了解它。
所以我的问题是:在这两种技术之间是否有任何交集(共同点),或者它们是互补的? …或完全不同?
总之,他们是非常不同的图书馆,用于不同的目的,但是有一些模糊的相似之处。
Redux是在整个应用程序中pipe理状态的工具。 它通常用作用户界面的体系结构。 把它看作Angular(的一半)的替代品。
RxJS是一个反应式编程库。 它通常用作在JavaScript中完成asynchronous任务的工具。 把它看作Promise的替代品。
反应式编程是一种从远处观察数据变化的范式(工作和思考方式)。 数据不会从远处改变 。
这是一个从远处改变的例子:
// In the controller.js file model.set('name', 'George');
模型从控制器更改 。
这是一个从远处观察的例子:
// logger.js store.subscribe(function (data) { console.log(data); });
在Logger中,我们观察Store中发生的数据变化(从远处),并写入控制台。
Redux仅仅使用Reactive模式:Store是被动的。 您不要从远处设置其内容。 这就是为什么在Redux中没有store.set()
。 商店从远处观察行动,并且改变自己。 而且商店允许其他人从远处观察其数据。
RxJS也使用了Reactive模式,但是它不是一个架构,而是为了实现这个“远距离观察”模式,它为您提供了基本的构build模块Observables 。
总而言之,为了不同的目的,截然不同的东西,但分享一些想法。
他们是非常不同的东西。
RxJS可以用来做react native编程,是一个非常全面的图书馆,有250多个运营商。
和Redux是在github repo上描述的“Redux是一个可预测的JavaScript应用程序状态容器”。
Redux只是一个处理应用程序状态的工具。 但相比之下,你可以在RxJS中构build一个完整的应用程序。
希望这可以帮助 :)
我只是想添加一些实际的差异,从我做Redux启发的RxJS代码。
我将每个动作types映射到一个Subject实例。 每个有状态的组件都会有一个Subject,然后映射到Reducer函数中。 所有reducerstream都merge
,然后scan
输出状态。 在scan
之前,使用startWith
设置默认值。 我为状态使用了publishReplay(1)
,但稍后可能会将其删除。
反应纯粹的渲染function将只发送到所有生产者/主题发送事件数据的地方。
如果你有孩子的组成部分,你需要描述这些状态是如何组合到你的。 combineLatest
可能是一个很好的起点。
实施中的显着差异:
-
没有中间件,只有rxjs运营商。 我认为这是最大的力量和弱点。 您仍然可以借用概念,但是我发现很难从姊妹社区(如redux和cycle.js)获得帮助,因为这是另一个定制解决scheme。 这就是为什么我需要在本文中写“我”而不是“我们”。
-
没有开关/案例或string的行动types。 你有一个更dynamic的分离行动的方式。
-
rxjs可以在其他地方用作工具,不包含在州pipe理中。
-
生产者数量less于行动types(?)。 我不确定这一点,但是您可以在收听子组件的父组件中有很多反应。 这意味着代码less,代码复杂。
-
您拥有解决scheme。 没有框架需要。 好和坏。 无论如何,你将最终编写自己的框架。
-
这是更多的分形,你可以很容易地订阅从一个子树,或应用程序状态树的多个部分的变化。
- 猜猜这样做是否容易? 真的很容易。
我还在将子组件描述为stream的更大的好处。 这意味着我们不必在reducer中调用父类和子类,因为我们可以基于组件结构recursion地组合(“恰好”)recursion地组合这些状态。
我也考虑过跳过反应,并用snabbdom或其他东西,直到React更好地处理反应状态。 为什么要把我们的国家build立起来,再通过道具来分解呢? 所以我会试着用Snabbdom做一个这个模式的版本2。
这里有一个更高级的小代码片段,其中state.ts文件构build状态stream。 这是ajaxforms的组件的状态,它获取带有validation规则和CSS样式的字段(input)的对象。 在这个文件中,我们只是使用字段名(对象键)将所有的孩子的状态结合到表单状态中。
export default function create({ Observable, ajaxInputs }) { const fieldStreams = Object.keys(ajaxInputs) .map(function onMap(fieldName) { return ajaxInputs[fieldName].state.stream .map(function onMap(stateData) { return {stateData, fieldName} }) }) const stateStream = Observable.combineLatest(...fieldStreams) .map(function onMap(fieldStreamDataArray) { return fieldStreamDataArray.reduce(function onReduce(acc, fieldStreamData) { acc[fieldStreamData.fieldName] = fieldStreamData.stateData return acc }, {}) }) return { stream: stateStream } }
虽然代码可能没有多less单独说明,但它显示了如何向上构build状态,以及如何轻松地生成dynamic事件。 支付的价格是你需要了解不同风格的代码。 我喜欢付这个代价。
你可以在RxJS的一行中“实现”Redux 。 如果你考虑Rx的其他原因(皮肤承诺,使用它在服务器和客户端),然后跳过Redux和所有的Rx。