React项目中Context API与Redux区别
想象一个带有购物清单整理器的厨房:
- 如果使用Context API:可以将其视为厨房中的常见白板,其中显示购物清单,任何人都可以看到并更改它。如果购物清单管理器是
- 如果使用Redux实现列表管理器:可以被视为高级版本,厨房中的所有人员不仅可以看到该列表,而且列表中的每个更新都可以追溯到进行更改的人。
因此,GraphQL可以被视为一个列表组织者,用于跟踪每个操作,而 Context API 用于更简单的任务。
什么是 Redux?
- Redux是一个开源 JavaScript 库,用于管理和集中应用程序状态。现代 Web 应用程序被表示为一个复杂的组件树,这些组件生成和共享称为状态的数据。
- Redux 是一种模式和库,可帮助开发人员大规模实现复杂的状态需求。它是由 Facebook 的 Dan Abramov 和 Andrew Clark 于 2015 年开发的。
- Redux 使用Typescript编写,具有跨平台兼容性。
首先,安装一个 React 应用程序:
1.安装Redux工具包。
npm install @reduxjs/toolkit react-redux
2.创建slice
import { createSlice, PayloadAction } from '@reduxjs/toolkit'; |
3、用Sclie创建Redux Store
import { configureStore } from '@reduxjs/toolkit'; |
4、为react 组件创建一个 Store,并用 Redux 库中的 Provider 对这个组件进行包装。
import React from 'react'; |
Redux组件
Redux 有三个主要组件:Store、Actions 和 Reducers。
- Store - 存储是一个 Javascript 对象,用于保存应用程序的状态。
- Actions - Actions 是定义状态变化并向 Redux 存储器发送数据的事件。
- Reducers - Reducers 是纯函数,用于接收状态和动作输入,并将状态作为输出返回。
Redux特点
- 单一真实源 - 应用程序的全局状态存储在对象树中的单一存储空间中。这一特性使调试变得更容易,并有助于在开发过程中保持应用程序的状态。
- 状态只读--只有通过发出动作才能更改状态,该动作是一个普通的 Javascript 对象,描述了所发生的事情。这种集中式更改链可避免出现竞赛条件问题。
- 使用纯函数进行更改--要指定状态树如何通过动作进行转换,需要编写纯还原器,它只是一个纯函数,用于获取之前的状态和动作,并返回一个新状态。
Redux局限性
- 模板代码--设置存储、操作和还原器需要大量模板代码,这可能会耗费初学者的时间。
- 性能开销 - 由于每次更新都需要复制状态,Redux 应用程序的性能会随着数据量的增大而降低。
- 复杂性--由于 Redux 的学习曲线对初学者来说比较困难,因此 Redux 与 React 的复杂性会增加。
使用案例
在以下情况下,Redux 是一个合适的选择
- 您的应用程序有许多状态,这些状态会被许多组件访问。
- 状态管理要求复杂,需要采用集中式方法。
- 应用程序状态更新频繁。
- 应用程序状态背后的逻辑复杂。
什么是Context API?
通过 React Context API,React 应用程序可以有效地生成可以传递的全局变量。它是 React 提供的一种状态管理解决方案。使用它,我们可以创建所谓的上下文,上下文提供状态和函数等值。它可以被包裹在上下文周围的一组组件所使用。
1. 创建一个Context.
import { createContext } from 'react'; |
2. 为Context创建一个Provider(提供者是制造上下文的) 。
import { useState, React } from "react"; |
3、在 React 组件中使用Context
import { useContext } from 'react'; |
Context API的组件
React Context 有两个主要组件:提供者(Provider)和消费者(Consumer)。
- Provider - Provider 用于定义和跟踪特定的状态片段。该组件负责提供跨组件共享的数据。上下文的上文
- Consumer - 消费者负责修改Provider提供的状态。上下文的下文
Context API 的优点
- 数据共享– 轻松数据共享是 Context API 的主要优势之一。您可以轻松地跨组件共享数据,而不必通过组件树的每个级别传递数据。因此,可以维持全局数据流,同时减少错误。
- Prop Drilling 的替代方案–当组件需要访问组件树中多个级别的数据时,就会发生Prop Drilling 。对于大型组件树,此方法变得困难且难以管理。因此,React Context API 提供了一种直接跨组件传递数据的机制,而不需要传递 props。
- 减少耦合——通过为支柱钻井提供替代方案,数据可以在各个组件之间传递,从而减少组件之间的耦合和依赖性,从而使应用程序更加高效。
- 集中化——使用全局状态流,可以集中存储数据,并且可以更有效地更新这些数据。
Context API 的局限性
- 性能低——对于大型组件树,Context值的不断更新可能会导致不必要的重新渲染并降低应用程序的性能。
- 测试——与基于 props 的状态管理的组件相比,上下文组件的测试更加困难。在测试期间提供正确的上下文值是一项艰巨的任务,并且需要额外的初始设置。
- 无类型安全– 上下文值未进行类型检查,因此编译器无法检测到错误的值,并可能导致运行时错误。
用例
在以下情况下,Context API 是一个合适的选择:
- 您希望在应用程序的不同组件之间共享数据或状态,并且需要一种集中的方式来访问和管理数据。
- 您的应用程序具有嵌套组件。在这种类型的应用程序中,您可以使用 Context API 避免道具钻探。
- 您的应用程序的状态需要动态更改或更新。
- 应用程序中需要通信的组件与组件树无关。
两者区别:
- Redux 使用集中式存储,其中actions 操作和reducer修改状态。
- Context API 使用分散式方法,其中状态使用提供者和使用者通过组件树传递。
性能区别:
- Redux :大型应用程序的高性能。
- Context API :使用简单,仅限于小规模应用。
使用区别:
- Redux 需要事先设置才能与 React 应用程序有效集成。
- Context API 需要最少的设置
调试:
- Redux 借助有效的 Redux 开发工具,调试变得更加容易。
- Context API 在嵌套组件树的情况下调试很困难。
结论
总之,在本文中,我们了解了 Redux 和 Context API 是什么、它们的组件、优点、限制和用例。两者对比可以看出,Redux适合有经验的专业人士使用,更适合大型应用,性能更好。另一方面,Context API可供初学者使用,更适合中小型应用程序,以获得更好的性能。两者之间的主要区别在于状态管理的方法。Redux 采用集中式方式,以 store、actions 和 Producer 为组件,而Context API 采用去中心化方式,以提供者和消费者为组件。
常见问题解答
Context API 可以代替 Redux 吗?
- 对于更简单的应用程序,React Context 足以维护应用程序,但对于更大的应用程序,Redux 就变得必要了。
Context 和 Redux 可以在应用程序中一起使用吗?
- 是的,React Context 和 Redux 可以在单个应用程序中一起使用,其中一些部分由 Redux 维护,一些部分由 React Context 维护。
Redux 和 React Context 的学习曲线有什么区别?
- 与 React Context 相比,Redux 的学习曲线更陡峭,更容易学习。