首页
技术小册
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全家桶--前端开发与实例(下)
### 11.9 添加`messagesReducer()`函数 在React全家桶的应用开发中,特别是在构建具有复杂状态管理需求的应用时,Redux成为了管理全局状态的首选库之一。Redux通过其单一的、可预测的状态树,以及纯函数(reducers)来执行状态的更新,极大地简化了复杂应用的状态管理。在本章,我们将深入探讨如何在Redux架构中添加一个名为`messagesReducer()`的reducer函数,以管理应用中的消息(messages)状态。 #### 11.9.1 理解Reducers 在Redux中,reducer是一个纯函数,它接收先前的state和一个action作为参数,返回新的state。重要的是,reducer必须保持纯净,即不修改传入的state,而是根据state和action返回一个新的state对象。这样的设计保证了Redux应用的状态变化是可预测的,也便于调试和测试。 #### 11.9.2 定义`messagesReducer()` 为了管理消息状态,我们需要创建一个专门的reducer函数`messagesReducer()`。这个函数将负责处理与消息相关的所有action,并根据这些action更新消息状态。 首先,我们需要定义可能触发消息状态更新的action类型。假设我们有两种类型的action:`ADD_MESSAGE`用于添加新消息,`REMOVE_MESSAGE`用于删除消息。 ```javascript // Action Types const ADD_MESSAGE = 'ADD_MESSAGE'; const REMOVE_MESSAGE = 'REMOVE_MESSAGE'; // Action Creators function addMessage(message) { return { type: ADD_MESSAGE, payload: message, }; } function removeMessage(messageId) { return { type: REMOVE_MESSAGE, payload: messageId, }; } ``` 接下来,我们编写`messagesReducer()`函数。这个函数将检查传入的action类型,并据此更新消息状态。 ```javascript function messagesReducer(state = [], action) { switch (action.type) { case ADD_MESSAGE: // 假设每条消息是一个对象,包含id和text属性 // 使用Date.now() + 随机数作为简单的id生成方式 const newMessageId = Date.now() + Math.floor(Math.random() * 1000); const newMessage = { id: newMessageId, text: action.payload }; // 使用数组的concat方法来保证不修改原数组 return state.concat(newMessage); case REMOVE_MESSAGE: // 使用filter方法过滤掉要删除的消息 return state.filter(message => message.id !== action.payload); default: // 如果action类型不匹配,则返回当前state return state; } } ``` 在这个reducer中,我们使用了数组的`concat`和`filter`方法来保证不直接修改原数组,而是返回一个新的数组作为新的state。这是遵循Redux reducer纯函数原则的关键。 #### 11.9.3 在Redux Store中使用`messagesReducer()` 创建了`messagesReducer()`之后,我们需要将其加入到Redux的store中。这通常是通过使用`combineReducers`函数(如果应用中有多个reducer)或直接将reducer作为参数传递给`createStore`函数(如果应用中只有一个reducer)来实现的。 假设我们的应用中有多个reducer,我们可以这样做: ```javascript import { createStore, combineReducers } from 'redux'; import { messagesReducer } from './reducers/messagesReducer'; import { anotherReducer } from './reducers/anotherReducer'; // 假设还有其他reducer const rootReducer = combineReducers({ messages: messagesReducer, // ... 其他reducer anotherState: anotherReducer, }); const store = createStore(rootReducer); ``` 这样,`messagesReducer`就负责处理与消息相关的state变化,而其他reducer则处理应用中的其他部分。 #### 11.9.4 在React组件中使用Redux Store中的消息状态 最后,我们需要在React组件中访问和使用Redux store中的消息状态。这通常是通过React-Redux库提供的`connect`函数或React的Hooks(如`useSelector`和`useDispatch`)来实现的。 使用`connect`函数(高阶组件方式): ```javascript import React from 'react'; import { connect } from 'react-redux'; function MessageList({ messages, addMessage }) { return ( <div> <button onClick={() => addMessage('Hello, Redux!')}>Add Message</button> <ul> {messages.map(message => ( <li key={message.id}>{message.text}</li> ))} </ul> </div> ); } const mapStateToProps = state => ({ messages: state.messages, }); const mapDispatchToProps = dispatch => ({ addMessage: message => dispatch(addMessage(message)), }); export default connect(mapStateToProps, mapDispatchToProps)(MessageList); ``` 或者使用Hooks(`useSelector`和`useDispatch`): ```javascript import React from 'react'; import { useSelector, useDispatch } from 'react-redux'; import { addMessage } from './actions/messageActions'; // 假设有对应的action creator function MessageList() { const messages = useSelector(state => state.messages); const dispatch = useDispatch(); const handleAddMessage = () => { dispatch(addMessage('Hello, Redux with Hooks!')); }; return ( <div> <button onClick={handleAddMessage}>Add Message</button> <ul> {messages.map(message => ( <li key={message.id}>{message.text}</li> ))} </ul> </div> ); } export default MessageList; ``` #### 11.9.5 总结 在本章中,我们详细探讨了如何在Redux架构中添加一个名为`messagesReducer()`的reducer函数来管理消息状态。我们首先定义了与消息相关的action类型和action creators,然后编写了`messagesReducer()`函数来处理这些action并更新消息状态。接着,我们展示了如何将这个reducer加入到Redux store中,并在React组件中通过不同的方式(高阶组件或Hooks)访问和使用这些状态。通过这个过程,我们深入理解了Redux的核心概念和工作原理,为构建更复杂、更健壮的React应用打下了坚实的基础。
上一篇:
11.8拆分reducer函数
下一篇:
11.10在reducer中定义初始状态
该分类下的相关小册推荐:
剑指Reactjs
React 进阶实践指南
深入学习React实战进阶
ReactJS面试指南
React全家桶--前端开发与实例(上)