使用Redux而不是Flux的缺点是什么

我最近才发现回来的。一切看起来都很好。使用Redux比Flux有什么缺点,缺点或妥协吗?谢谢

38821 次浏览

Redux和Flux都需要大量的样板代码来覆盖许多常见模式,特别是那些涉及异步数据获取的模式。Redux文档已经有了一些简化样板文件的例子:http://redux.js.org/docs/recipes/ReducingBoilerplate.html。你可以从像Alt或Fluxxor这样的Flux库中获得你可能需要的一切,但Redux更喜欢自由而不是特性。对于一些开发人员来说,这可能是一个缺点,因为Redux对您的状态做出了某些假设,而这些假设可能会被无意中忽略。

你真正回答你的问题的唯一方法是尝试Redux,如果你可以的话,也许在一个个人项目中。Redux的出现是因为开发人员需要更好的体验,它倾向于函数式编程。如果你不熟悉函数概念,比如约简器和函数组合,那么你可能会慢下来,但只是稍微慢一点。在数据流中采用这些想法的好处是更容易测试和可预测性。

免责声明:我从Flummox(一种流行的Flux实现)迁移到Redux,优点远大于缺点。我希望我的代码中少一些魔法。减少魔法的代价是更多的样板,但这是一个非常小的代价。

Redux作者在这里!

我想说的是,你将在使用它时做出以下妥协:

  • 你需要学会避免突变。Flux对数据突变没有意见,但Redux不喜欢突变,许多与Redux互补的包假设你永远不会改变状态。你可以使用只有开发的包来强制这一点,比如redux-immutable-state-invariant,使用Immutable.js,或者相信你自己和你的团队编写非可变代码,但这是你需要意识到的,这需要是你的团队接受的有意识的决定。

  • 你得仔细挑选你的包裹。虽然Flux明确不试图解决“附近”的问题,如撤销/重做持久性,或形式, Redux有扩展点,如中间件和存储增强器,它催生了一个年轻但丰富的生态系统。这意味着大多数软件包都是新想法,还没有得到足够的使用。你可能依赖的某些东西在几个月后会变成一个明显的坏主意,但现在还很难说。

  • 你还不会有一个很好的流集成。 Flux目前让你做非常令人印象深刻的静态类型检查其中Redux 还不支持。我们会到达那里,但需要一些时间。

我认为第一个是初学者的最大障碍,第二个是过度热情的早期采用者的问题,第三个是我个人的烦恼。除此之外,我不认为使用Redux会带来Flux所避免的任何特定缺点,有些人甚至说它与Flux相比有一些优点。


另见我在使用Redux的好处上的回答。

相对于其他Flux替代品,使用Redux的最大好处之一是它能够将您的思想重新定位为更实用的方法。一旦你理解了这些线是如何连接起来的,你就会意识到它在设计上令人惊叹的优雅和简单,而且永远不会回头。

通量回来的

Redux不是一个纯粹的Flux实现,但肯定是受到了Flux的启发。最大的区别是它使用了一个单独的存储,该存储包装了一个包含应用程序所有状态的状态对象。与在Flux中创建存储不同,您将编写将更改单个对象状态的reducer函数。这个对象代表应用程序中的所有状态。在Redux中,你将获得当前的动作和状态,并返回一个新的状态。这意味着动作是顺序的,状态是不可变的。在我看来,这是Redux中最明显的骗局。

人力资源> < p > < Redux支持不可变的概念。

为什么不变性?

有几个原因:
1. 一致性 - store的状态总是被reducer改变,所以很容易跟踪谁改变了什么 2. 性能 -因为它是不可变的,Redux只需要检查之前的状态!==当前状态,如果是,则呈现。不需要每次循环状态以确定渲染 3.调试 -新的很棒的概念,如时间旅行调试热重载.

更新:如果这还不够说服你,观看李拜伦 excellent谈论不可变用户界面

Redux需要开发人员通过代码库/库来维护这一思想。您需要确保以不可变的方式选择库和编写代码。

如果你想了解更多关于Flux概念的不同实现(以及什么最适合你的需求),请查看有用的比较。

说了这么多,我必须承认Redux是JS未来发展的方向(至于写这些行)。

Redux要求关于不变性的纪律。我可以推荐ng-freeze,让您了解任何意外的状态突变。

我更喜欢使用回来的,因为它使用一个存储,这使得状态管理比通量更容易,还有回来的DevTools,它是非常有用的工具,让你看到你对你的状态和一些有用的数据做了什么,它真的内联React开发工具。

同时,回来的在与其他流行的框架(如)一起使用时具有更大的灵活性。 不管怎样,让我们看看Redux是如何介绍自己作为一个框架的

Redux有三个原则,它可以很好地介绍Redux,它们也是Redux和Flux之间的主要区别。

真相来源单一

整个应用程序的状态存储在一个对象树中

这使得它很容易创建通用应用程序,从你的状态 服务器可以序列化并水化到客户端,而不需要额外的操作 编码工作。单个状态树还使调试或调试变得更容易 检查申请;它还允许你持久化你的应用程序 国家在发展,为更快的发展周期。一些 传统上难以实现的功能- 撤销/重做,例如-可以突然变得微不足道的实现,如果 你所有的状态都存储在一个树中
console.log(store.getState())


/* Prints
{
visibilityFilter: 'SHOW_ALL',
todos: [
{
text: 'Consider using Redux',
completed: true,
},
{
text: 'Keep all state in a single tree',
completed: false
}
]
}
*/

状态为只读

改变状态的唯一方法是触发一个动作,一个对象

这确保视图和网络回调都不会 永远不要直接写信给国家。相反,他们表达了一种意图 转换状态。因为所有的变化都是集中发生的 一个一个严格按顺序来,没有微妙的竞争条件来 注意。由于动作只是简单的对象,它们可以被记录下来, 序列化、存储,然后重放以供调试或测试 目的。< / p >

store.dispatch({
type: 'COMPLETE_TODO',
index: 1
})


store.dispatch({
type: 'SET_VISIBILITY_FILTER',
filter: 'SHOW_COMPLETED'
})

使用纯函数进行更改

要指定如何通过操作转换状态树,您可以写入 纯还原剂。< / p > Reducers只是一个纯粹的函数,它接受前一个状态和一个 操作,并返回下一个状态。记得返回新状态 对象,而不是改变以前的状态。你可以从a开始 单个减速器,随着应用程序的发展,将其拆分为更小的 管理状态树特定部分的约简器。因为 约简只是函数,你可以控制它们的顺序 被调用,传递额外的数据,甚至使可重用的约简

function visibilityFilter(state = 'SHOW_ALL', action) {
switch (action.type) {
case 'SET_VISIBILITY_FILTER':
return action.filter
default:
return state
}
}


function todos(state = [], action) {
switch (action.type) {
case 'ADD_TODO':
return [
...state,
{
text: action.text,
completed: false
}
]
case 'COMPLETE_TODO':
return state.map((todo, index) => {
if (index === action.index) {
return Object.assign({}, todo, {
completed: true
})
}
return todo
})
default:
return state
}
}


import { combineReducers, createStore } from 'redux'
let reducer = combineReducers({ visibilityFilter, todos })
let store = createStore(reducer)

更多信息请访问在这里

据我所知,redux的灵感来自于通量。flux是一个类似MVC(模型视图控制器)的架构。facebook在使用MVC时由于可扩展性问题引入了流量。所以通量不是一个实现,它只是一个概念。实际上redux是通量的实现。