247

I just recently discovered Redux. It all looks good. Are there any downsides, gotcha or compromises of using Redux over Flux? Thanks

4

7 回答 7

416

Redux 作者在这里!

我想说您将使用它做出以下妥协:

  • 你需要学会避免突变。Flux 对改变数据没有意见,但 Redux 不喜欢突变,许多与 Redux 互补的包都假设你永远不会改变状态。您可以使用诸如redux-immutable-state-invariant 之类的仅开发包来强制执行此操作,使用Immutable.js,或者相信您自己和您的团队编写非可变代码,但这是您需要注意的事情,这需要成为你的团队接受的有意识的决定。

  • 您将不得不仔细挑选您的包裹。尽管 Flux 明确不尝试解决诸如undo/redo持久性表单之类的“附近”问题,但 Redux 具有中间件和存储增强器等扩展点,它催生了一个年轻但丰富的生态系统。这意味着大多数软件包都是新想法,尚未获得大量使用。几个月后你可能会依赖一些显然是个坏主意的东西,但现在还很难说。

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

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


另请参阅我对使用 Redux的好处的回答。

于 2015-10-02T22:12:40.657 回答
37

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

真正回答问题的唯一方法是尽可能尝试 Redux,也许是在个人项目中。Redux 的出现是因为需要更好的开发人员体验,并且偏向于函数式编程。如果你不熟悉 reducer 和函数组合之类的函数概念,那么你可能会放慢速度,但只是稍微慢了一点。在数据流中采用这些想法的好处是更容易测试和预测。

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

于 2015-08-16T02:21:20.823 回答
17

通量还原。. .

Redux 不是纯粹的 Flux 实现,但绝对受到 Flux 的启发。最大的区别是它使用了一个单独的存储,该存储包含一个包含应用程序所有状态的状态对象。无需像在 Flux 中那样创建存储,您将编写将更改单个对象状态的 reducer 函数。此对象代表您应用中的所有状态。在 Redux 中,您将获得当前的操作和状态,并返回一个新的状态。这意味着动作是顺序的,状态是不可变的。这让我想到了 Redux 中最明显的缺点(在我看来)。


Redux 支持一个不可变的概念。

为什么是不变性?

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

更新:如果这还不够说服力,请观看Lee Byron关于不可变用户界面的精彩演讲。

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

如果您想了解有关 Flux 概念的不同实现的更多信息(以及最适合您的需求),请查看这个有用的比较。

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

于 2016-01-21T03:00:33.703 回答
15

与其他 Flux 替代品相比,使用 Redux 的最大好处之一是它能够将您的思维重新定位到更实用的方法上。一旦您了解了所有电线的连接方式,您就会意识到其令人惊叹的优雅和简洁的设计,并且永远不会回头。

于 2015-10-03T08:44:30.240 回答
4

我更喜欢使用Redux ,因为它使用一个存储,与Flux相比,它使状态管理更容易,还有Redux DevTools,它是非常有用的工具,可以让你通过一些有用的数据查看你对状态的处理,它确实与 React 开发工具内联。

此外, Redux与其他流行的框架(如Angular )一起使用时获得了更大的灵活性。无论如何,让我们看看 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
    }
  ]
}
*/

状态是只读的

改变状态的唯一方法是发出一个动作,一个描述发生了什么的对象。

这确保了视图和网络回调都不会直接写入状态。相反,他们表达了改变国家的意图。因为所有更改都是集中的,并且以严格的顺序逐一发生,所以没有需要注意的微妙竞争条件。由于动作只是简单的对象,它们可以被记录、序列化、存储,并在以后重放以用于调试或测试目的。

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

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

使用纯函数进行更改

要指定状态树如何通过操作进行转换,您可以编写纯 reducer。

Reducers 只是纯粹的函数,它接受前一个状态和一个动作,然后返回下一个状态。记住要返回新的状态对象,而不是改变以前的状态。您可以从单个 reducer 开始,随着应用程序的增长,将其拆分为管理状态树特定部分的更小的 reducer。因为 reducer 只是函数,你可以控制它们被调用的顺序,传递额外的数据,甚至为分页等常见任务制作可重用的 reducer。

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)

欲了解更多信息,请访问这里

于 2017-05-27T09:22:31.787 回答
0

Redux 需要关于不变性的纪律。我可以推荐的是 ng-freeze 让你知道任何意外的状态突变。

于 2016-11-02T05:39:33.297 回答
-1

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

于 2019-04-17T19:16:08.020 回答