React Context vs React Redux,我应该什么时候使用它们?

React 16.3.0发布了 ,而且 背景 API 不再是一个实验特性。Dan Abramov (Redux 的创建者)就此写了一篇很好的评论 给你,但是那是两年前 Context 还是一个实验特性。

我的问题是,根据你的观点/经验,我什么时候应该使用 反应环境而不是 返璞归真,反之亦然?

107157 次浏览

由于上下文不再是一个实验性的特性,你可以直接在你的应用程序中使用Context,它将非常适合将数据传递给深度嵌套的组件,而这正是它设计的目的。

正如Mark Erikson在他的博客中所写的:

如果你只是使用Redux来避免传递道具,context可以 取代Redux -但你可能不需要Redux在第一 的地方。< / p >

Context也不会给你任何类似Redux DevTools的东西 能够跟踪您的状态更新,middleware添加集中 应用程序逻辑,和其他强大的功能,Redux 允许. < / p >

Redux更强大,并提供了大量Context API所不提供的特性,也如@danAbramov所述

React Redux内部使用上下文,但它不暴露这一事实 公共API。因此,通过React使用context应该会更安全 比起直接Redux,因为如果它改变了,更新的负担就大了 代码将在React Redux上,而不是你

它取决于Redux实际更新它的实现,以遵守最新的上下文API。

最新的上下文API可以用于在组件之间简单地使用Redux传递数据的应用程序,但是使用集中数据和处理API请求的应用程序在动作创建者中使用redux-thunkredux-saga仍然需要Redux。除此之外,Redux还有其他与它相关的库,如redux-persist,它允许你在localStorage中保存/存储数据,并在刷新时补充水,这是Context API仍然不支持的。

正如@dan_abramov在他的博客你可能不需要Redux中提到的,Redux有一些有用的应用程序,比如

  • 将状态持久化到本地存储,然后从它启动,开箱即用。
  • 在服务器上预填充状态,以HTML形式将其发送到客户端,并从它启动,开箱即用。
  • 序列化用户操作,并将它们与状态快照一起附加到自动错误报告中,以便产品开发人员
    . 0 可以重放它们来重现错误。
  • 通过网络传递操作对象以实现协作环境,而无需对代码的编写方式进行重大更改。
  • 维护撤销历史记录或实现乐观突变,而无需对代码的编写方式进行重大更改。
  • 在国家发展历史中穿行,重新评价国家;当代码改变时,从动作历史记录中获取当前状态,类似于TDD。
  • 为开发工具提供完整的检查和控制功能,以便产品开发人员可以为他们的应用程序构建自定义工具。
  • 在重用大部分业务逻辑的同时提供可选的ui。

有了这么多的应用程序,现在说Redux将被新的Context API所取代还为时过早。

如果你使用Redux只是为了避免将道具传递给嵌套很深的组件,然后你可以用Context API替换Redux。它正是为这个用例而设计的。

另一方面,如果你用Redux做其他事情(拥有一个可预测的状态容器,在组件之外处理应用程序的逻辑,集中应用程序的状态,使用回来的DevTools跟踪应用程序的状态何时、何地、为什么以及如何改变,或者使用诸如回来的形式回家的故事回来的撤销回来的坚持回来的记录器等插件),那么你绝对没有理由放弃Redux。Context API不提供任何这些。

我个人认为Redux DevTools扩展是一个惊人的,被低估的调试工具,它本身证明了继续使用Redux。

参考:

我更喜欢使用redux和redux-thunk进行API调用(也使用Axios)并将响应分配给reducers。它是干净的,容易理解。

Context API对于React -redux部分的React组件如何连接到存储是非常特定的。对于这一点,反应-还原是很好的。但是如果你想,因为Context是官方支持的,你可以使用Context API而不是react-redux。

所以,问题应该是上下文API vs react-redux,而不是上下文API vs redux。而且,这个问题有点固执己见。由于我熟悉react-redux并在所有项目中使用它,我将继续使用它。(我没有动力去改变)。

但是如果你今天才开始学习redux,而且你还没有在任何地方使用过它,那么就有必要尝试一下Context API,用你的自定义Context API代码替换react-redux。也许那样更干净。

就我个人而言,这是一个熟悉程度的问题。没有明确的理由选择其中一个而不是另一个,因为它们是等价的。在内部,react-redux使用Context。

对我来说,使用Redux的唯一原因是:

  • 你需要一个全局状态对象(出于各种原因,比如可调试性、持久性……)
  • 你的应用程序现在或将来会很大,并且应该扩展到许多开发人员:在这种情况下,你可能需要一个间接级别(即事件系统):你触发事件(在过去),然后你的组织中你不认识的人实际上可以听到它们

你可能不需要整个应用的间接级别,所以混合使用样式,同时使用本地状态/上下文和Redux是很好的。

    例如,记录动作,错误报告,调度其他请求取决于 在服务器的响应上,等等
  • 当来自多个端点的数据影响单个组件/视图时。
  • 当您希望对应用程序中的操作有更大的控制时。 Redux启用跟踪操作和数据更改,它 大大简化了调试 Redux添加了一个层,在那里你可以决定如何,何时 如果这些数据被应用。观察者模式。而不是 在整个应用中创建多个发布者和订阅者,你 只需将组件连接到Redux存储

来自:什么时候使用Redux?