首页
技术小册
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.6 Redux的核心 在React生态系统中,Redux作为状态管理库,扮演着至关重要的角色,尤其是在构建复杂、可维护性高的前端应用时。Redux通过提供可预测化的状态管理方式来简化应用中的数据流,使得开发者能够清晰地追踪和调试应用状态的变化。本章将深入解析Redux的核心概念,包括其设计原则、三大原则(单一真实数据源、状态是只读的、使用纯函数来执行修改)、以及Redux的核心组成部分:Store、Action、Reducer。 #### 10.6.1 Redux的设计哲学 Redux的设计哲学基于几个核心原则,这些原则共同构成了Redux强大而灵活的基础。 - **单一真实数据源(Single source of truth)**:整个应用的状态被存储在一个单一的store对象中,这个对象包含了应用的所有状态。单一数据源使得状态的变化变得可预测和可追踪,因为任何状态的更新都会通过Redux的流程进行,从而避免了状态分散在多个组件或全局变量中导致的混乱。 - **状态是只读的(State is read-only)**:唯一改变状态的方法是触发action,action是一个描述已发生事件的普通对象。这意味着你不能直接修改状态,而是需要描述一个想要发生的变更,然后Redux会根据你的描述来更新状态。 - **使用纯函数来执行修改(Changes are made with pure functions)**:为了指定状态树如何通过actions转换,你需要编写reducers。Reducers是纯函数,它们接收先前的状态和一个action,并返回新的状态。由于reducers是纯函数,它们不会修改传入的状态,而是返回一个新的状态对象。这保证了应用状态的不可变性,使得应用状态的变化更加清晰和可预测。 #### 10.6.2 Redux的核心组成部分 Redux的核心由三个主要部分组成:Store、Action、Reducer。它们共同协作,实现了Redux的状态管理机制。 ##### 10.6.2.1 Store Store是Redux中唯一保存应用状态的地方,它有三个主要的方法:`getState()`、`dispatch(action)`、`subscribe(listener)`。 - **getState()**:返回应用当前的状态。这个方法不会修改状态,只是返回状态的当前表示。 - **dispatch(action)**:是改变状态的唯一途径。它接收一个action对象作为参数,并将这个action对象发送给reducer,然后reducer根据action的类型来更新状态。 - **subscribe(listener)**:注册一个监听器,当dispatch action并导致状态变化时,这个监听器会被调用。这允许UI组件订阅并响应状态的变化。 ##### 10.6.2.2 Action Action是一个描述已发生事件的普通对象。它必须有一个`type`属性来指示发生了哪种类型的action,此外,它还可以包含其他任何用于描述该action的数据。Action是发送数据到store的唯一途径,它是store数据的唯一来源。 ```javascript { type: 'ADD_TODO', text: 'Learn Redux' } ``` 在这个例子中,`ADD_TODO`是action的类型,而`text`是传递给reducer的额外信息,用于描述要添加到待办事项列表中的具体内容。 ##### 10.6.2.3 Reducer Reducer是一个纯函数,它接收先前的状态和一个action作为参数,并返回新的状态。Reducer必须保持纯净,即不修改传入的参数,也不执行任何有副作用的操作(如API调用或路由跳转)。Reducer的唯一职责是根据action来更新状态。 ```javascript function todos(state = [], action) { switch (action.type) { case 'ADD_TODO': return [...state, { text: action.text, completed: false }]; default: return state; } } ``` 在这个例子中,`todos` reducer根据action的类型来决定如何更新待办事项列表的状态。如果action的类型是`ADD_TODO`,则向列表中添加一个新的待办事项;否则,返回当前的状态。 #### 10.6.3 Redux的工作流程 Redux的工作流程可以概括为以下几个步骤: 1. **创建Action**:当应用中的某些事件发生时(如用户输入、API请求完成等),会创建一个描述该事件的action对象。 2. **分发Action**:通过调用store的`dispatch`方法,将action对象发送给store。 3. **调用Reducer**:store接收到action后,会调用与当前状态相关的reducer函数,并将当前状态和action作为参数传递给reducer。 4. **返回新状态**:reducer根据action的类型和当前状态,计算出新的状态,并返回这个新状态。 5. **更新Store状态**:store接收到reducer返回的新状态后,会更新自己的内部状态,并通过注册的监听器通知所有订阅了状态变化的组件。 6. **渲染UI**:组件接收到状态变化的通知后,会根据新的状态重新渲染UI。 #### 10.6.4 Redux的扩展与中间件 虽然Redux的核心功能已经足够强大,但Redux社区还提供了许多扩展和中间件来增强Redux的功能,如Redux Thunk、Redux Saga等,它们允许你编写异步逻辑、处理副作用等。 - **Redux Thunk**:允许你编写返回函数的action creators,这些函数可以延迟dispatch action,直到异步操作完成。 - **Redux Saga**:使用ES6的generator函数来管理复杂的异步操作,如API调用、WebSocket连接等。Saga提供了一种更灵活的方式来处理副作用,并且与Redux的reducer保持解耦。 #### 10.6.5 总结 Redux通过其设计哲学和核心组成部分,为React应用提供了一种可预测、可维护的状态管理方式。通过遵循单一真实数据源、状态只读、使用纯函数来执行修改的原则,Redux使得应用的状态变化变得清晰、可追踪和可预测。同时,Redux的扩展和中间件机制也为开发者提供了丰富的工具来应对复杂的异步操作和副作用处理。掌握Redux的核心概念和工作流程,对于构建高效、可维护的React应用至关重要。
上一篇:
10.5构建store
下一篇:
10.7早期的聊天应用程序
该分类下的相关小册推荐:
React全家桶--前端开发与实例(上)
剑指Reactjs
React 进阶实践指南
ReactJS面试指南
深入学习React实战进阶