首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
9.1URL中有什么
9.2构建react-router组件
9.3使用React Router的动态路由
9.4支持身份验证的路由
10.1Flux诞生的原因
10.2Flux实现
10.3Redux
10.4构建一个计数器
10.5构建store
10.6Redux的核心
10.7早期的聊天应用程序
10.8构建reducer()函数
10.9订阅store
10.10将Redux连接到React
11.1Redux中间件准备
11.2使用redux库的createStore()函数
11.3将消息表示为处于状态中的对象
11.4引入多线程387
11.5添加ThreadTabs组件
11.6在reducer中支持多线程
11.7添加OPEN_THREAD动作
11.8拆分reducer函数
11.9添加messagesReducer()函数
11.10在reducer中定义初始状态
11.11使用redux的combineReducers()函数
12.1表示组件和容器组件
12.2拆分ThreadTabs组件
12.3拆分Thread组件
12.4从App组件中移除store
12.5使用react-redux库创建容器组件
12.6动作创建器
13.2GraphQL的好处
13.3GraphQL和REST
13.4GraphQL和SQL
13.5Relay 框架和GraphQL框架
13.7使用GraphQL
13.8探索GraphiQL
13.9GraphQL语法
13.10复杂类型
13.11探索Graph
13.12图节点
13.13viewer
13.14图的连接和边
13.15变更
13.16订阅
13.17GraphQL和JavaScript结合使用
13.18GraphQL与React结合使用
14.1编写一个GraphQL服务器
14.2Windows用户的特殊设置
14.3连接
15.1经典Relay介绍
15.2Relay是一个数据架构
15.3Relay和GraphQL约定
15.4将Relay添加到应用程序中
15.5BooksPage组件
15.6使用变更修改数据
15.7构建图书页面
16.1React Native初始化
16.2路由
16.4Web组件与原生组件
16.5样式
16.6HTTP请求
16.7什么是promise
16.8一次性使用保证
16.9创建新promise
16.10使用React Native进行调试
当前位置:
首页>>
技术小册>>
React全家桶--前端开发与实例(下)
小册名称:React全家桶--前端开发与实例(下)
### 10.3 Redux:状态管理的艺术 在复杂的前端应用中,随着组件数量的增加和交互逻辑的复杂化,如何有效地管理应用的状态成为了一个核心挑战。React 本身通过组件的状态(state)和属性(props)提供了一种管理状态的方式,但在大型应用中,这种管理方式往往显得力不从心,特别是当多个组件需要共享状态时。这时,Redux 应运而生,它以其独特的架构模式和简洁的 API,成为了 React 应用中状态管理的首选方案。 #### 10.3.1 Redux 概览 Redux 是一个可预测的状态容器,用于 JavaScript 应用中。它帮助你将应用中的状态(数据)集中存放在一个单一的对象树中,并且这个状态树只存在于唯一的 store 中。这意味着,无论应用有多么复杂,其状态都通过一个单一的、可预测的源进行管理。Redux 还提供了严格的规则来确保状态以可预测的方式更新: - **单一真实数据源**:整个应用的状态被存储在一棵对象树中,并且这个对象树只存在于唯一一个 store 中。 - **状态是只读的**:唯一改变状态的方法是触发 action,action 是一个用于描述已发生事件的普通对象。 - **使用纯函数来执行修改**:为了指定 state 树如何通过 actions 转变,你需要编写纯函数,这些函数称为 reducers。 #### 10.3.2 核心概念 ##### 10.3.2.1 Action Action 是把数据从应用传到 store 的有效载荷。它是普通对象,拥有一个 `type` 属性(表明 action 的类型)以及用于描述 action 的其他信息(如数据)。例如,一个添加新待办事项的 action 可能如下所示: ```javascript { type: 'ADD_TODO', payload: 'Learn Redux' } ``` ##### 10.3.2.2 Reducer Reducer 指定了应用状态的变化如何响应 actions 并发送到 store 的。Reducer 只是一个接收先前的 state 和一个 action,并返回新的 state 的函数。记住,reducer 必须是纯函数,即给定相同的输入,它必须始终产生相同的输出,并且不执行任何副作用(如 API 调用或路由跳转)。 ```javascript function todoReducer(state = [], action) { switch (action.type) { case 'ADD_TODO': return [...state, action.payload]; default: return state; } } ``` ##### 10.3.2.3 Store Store 是将 actions 发送给 reducer 并将新的 state 保持在单一状态树的地方。Store 有以下职责: - 维持应用的 state; - 提供 `getState()` 方法获取当前 state; - 提供 `dispatch(action)` 方法更新 state; - 通过 `subscribe(listener)` 方法注册监听器以响应 state 的变化。 #### 10.3.3 Redux 流程 Redux 的工作流程可以概括为以下四个步骤: 1. **创建 Action**:当用户的操作或数据变更时,首先会创建一个 action,这个 action 是一个普通的 JavaScript 对象,用于描述发生了什么。 2. **分发 Action**:然后,这个 action 被发送到 store。Store 会通过调用 store.dispatch() 方法来发送 action。 3. **调用 Reducer**:store 会将当前的 state 和接收到的 action 发送给 reducer 函数。Reducer 会根据 action 的类型来执行相应的状态更新逻辑,并返回新的 state。 4. **更新 State**:Store 会用 reducer 返回的新 state 来更新自己的内部状态。这个过程是自动完成的,且是唯一的更新 state 的途径。 5. **订阅响应**:Store 允许监听器(listener)来订阅 state 的变化。每当 state 更新时,所有订阅的监听器都会被调用,并接收到当前的 state 作为参数。 #### 10.3.4 使用 Redux 与 React 要在 React 应用中使用 Redux,你通常还需要安装并使用 React-Redux,这是一个官方提供的库,用于在 React 组件中连接 Redux store。React-Redux 提供了两个核心组件:`Provider` 和 `connect`。 - **Provider**:`Provider` 组件包裹你的整个 React 应用,使所有的组件都能访问到 Redux store。你只需要在应用的最顶层组件上包裹 `<Provider store={store}>` 即可。 - **connect**:`connect` 函数用于连接 React 组件与 Redux store。它接收两个可选的参数:`mapStateToProps` 和 `mapDispatchToProps`。`mapStateToProps` 是一个函数,用于将 state 中的数据作为 props 传递给组件;`mapDispatchToProps` 是另一个函数,用于将 action creators 转换为 props,使组件可以直接调用它们来分发 actions。 #### 10.3.5 实战演练 假设我们正在开发一个待办事项列表应用,现在让我们通过 Redux 来管理这个应用的状态。 1. **设置 Redux Store**: 首先,定义 actions 和 reducer,并创建 store。 2. **集成 Redux 到 React 应用**: 使用 React-Redux 的 `Provider` 组件包裹整个应用,并通过 `connect` 函数将组件与 Redux store 连接起来。 3. **在组件中使用 Redux 状态和 Actions**: 通过 `mapStateToProps` 和 `mapDispatchToProps` 将 state 和 action creators 映射为组件的 props,然后在组件内部使用这些 props 来渲染 UI 和触发 actions。 4. **处理异步逻辑**: 对于需要处理异步操作(如从服务器获取数据)的场景,Redux 提供了中间件(如 redux-thunk 或 redux-saga)来支持异步 action 的分发和处理。 #### 10.3.6 优势和挑战 **优势**: - **可预测性**:Redux 的状态更新逻辑是高度可预测的,因为所有的变更都遵循相同的模式。 - **可维护性**:状态逻辑被封装在 reducers 中,使得应用的状态管理更加集中和易于维护。 - **可测试性**:由于 reducers 是纯函数,它们很容易被测试,这有助于确保应用的行为符合预期。 **挑战**: - **学习曲线**:Redux 的概念相对抽象,特别是对于初学者来说,需要一定时间来理解和掌握。 - **样板代码**:在大型应用中,可能会产生大量的样板代码,如 action creators、reducers 和 selectors。 - **性能考虑**:虽然 Redux 的性能通常不是问题,但在某些极端情况下(如频繁更新大型状态树),可能需要考虑性能优化。 #### 10.3.7 结论 Redux 为 React 应用提供了一种强大而灵活的状态管理方案。通过遵循其设计原则,我们可以构建出可预测、可维护和可扩展的前端应用。然而,Redux 并不是银弹,它也有其适用的场景和局限性。在决定是否使用 Redux 时,我们需要根据应用的具体需求和团队的实际情况来做出合理的选择。
上一篇:
10.2Flux实现
下一篇:
10.4构建一个计数器
该分类下的相关小册推荐:
ReactJS面试指南
React全家桶--前端开发与实例(上)
React 进阶实践指南
剑指Reactjs
深入学习React实战进阶