首页
技术小册
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.5 构建Store 在React应用中,随着应用复杂度的增加,管理应用的状态(state)变得尤为重要。React本身提供了组件级的状态管理,但当应用扩展到包含多个组件、跨组件通信频繁时,单一的组件状态管理方式就显得力不从心。这时,引入全局状态管理库如Redux、MobX或Context API等就变得十分必要。本章节将重点介绍如何在React应用中构建Redux风格的store,以实现更加高效和可维护的状态管理。 #### 10.5.1 Redux基础 在开始构建store之前,理解Redux的基本概念是必不可少的。Redux是一个用于JavaScript应用的可预测状态容器,它帮助你以同一方式更新和管理应用中所有部分的状态,并让这些状态的更新以可预测的方式发生。Redux的核心概念包括: - **Store**:保存着整个应用的状态树,并提供获取状态(`getState()`)、分发行动(`dispatch(action)`)和订阅监听(`subscribe(listener)`)的方法。 - **Action**:一个描述已发生事件的普通对象,是改变状态树的唯一途径。 - **Reducer**:一个纯函数,接收先前的状态和一个action,返回新的状态。 #### 10.5.2 初始化Redux Store 在React项目中引入Redux,首先需要安装Redux相关的npm包。假设你正在使用npm或yarn作为包管理器,可以通过以下命令安装Redux: ```bash npm install redux # 或者 yarn add redux ``` 接下来,我们将创建一个简单的Redux store。首先,定义一些actions和reducers。 ##### Actions Actions是普通的JavaScript对象,用于描述应用中发生的事件。例如,我们可以定义一个`increment` action来增加计数器: ```javascript // actions.js export const increment = () => ({ type: 'INCREMENT' }); export const decrement = () => ({ type: 'DECREMENT' }); ``` ##### Reducers Reducer是一个纯函数,它接收当前的state和一个action,返回一个新的state。这里,我们编写一个简单的reducer来处理计数器的增减: ```javascript // reducer.js const initialState = { count: 0 }; function counterReducer(state = initialState, action) { switch (action.type) { case 'INCREMENT': return { ...state, count: state.count + 1 }; case 'DECREMENT': return { ...state, count: state.count - 1 }; default: return state; } } export default counterReducer; ``` ##### 创建Store 现在,我们有了actions和reducers,接下来就可以使用Redux的`createStore`函数来创建store了: ```javascript // store.js import { createStore } from 'redux'; import counterReducer from './reducer'; const store = createStore(counterReducer); export default store; ``` #### 10.5.3 在React组件中使用Redux Store 为了在React组件中使用Redux store,我们需要一个方式来连接React组件和Redux store。Redux提供了`react-redux`库来实现这一功能,它包含`Provider`和`connect`两个主要组件。 ##### 安装react-redux 首先,安装`react-redux`: ```bash npm install react-redux # 或者 yarn add react-redux ``` ##### 使用Provider包裹App `Provider`组件让容器组件能够访问到store。你需要在React应用的顶层组件上包裹`Provider`,并将store作为props传递给它: ```javascript // App.js import React from 'react'; import ReactDOM from 'react-dom'; import { Provider } from 'react-redux'; import store from './store'; import AppComponent from './AppComponent'; ReactDOM.render( <Provider store={store}> <AppComponent /> </Provider>, document.getElementById('root') ); ``` ##### 连接组件到Redux Store `connect`函数用于连接React组件与Redux store。它允许你将Redux store中的数据作为props注入到组件中,并监听Redux actions,以便在状态更新时重新渲染组件。 ```javascript // AppComponent.js import React from 'react'; import { connect } from 'react-redux'; import { increment, decrement } from './actions'; function AppComponent({ count, increment, decrement }) { return ( <div> <p>Count: {count}</p> <button onClick={increment}>Increment</button> <button onClick={decrement}>Decrement</button> </div> ); } const mapStateToProps = state => ({ count: state.count }); const mapDispatchToProps = { increment, decrement }; export default connect(mapStateToProps, mapDispatchToProps)(AppComponent); ``` 在上面的例子中,`mapStateToProps`函数将Redux store中的state映射到组件的props上,而`mapDispatchToProps`则是一个将action creators转换为props对象,使得action creators可以以props的形式被组件调用。 #### 10.5.4 进阶话题:Redux Middleware和异步Action 随着应用的深入,你可能会遇到需要处理异步操作(如API调用)的情况。Redux本身只支持同步的数据流,但你可以通过中间件(Middleware)来扩展Redux的功能,使其能够处理异步action。 ##### 安装Redux Thunk Redux Thunk是Redux的一个中间件,允许你编写返回函数的action creators,这些函数可以包含异步操作,如setTimeout或fetch API调用。 ```bash npm install redux-thunk # 或者 yarn add redux-thunk ``` ##### 配置Redux Thunk 将Redux Thunk中间件添加到你的store中: ```javascript // store.js import { createStore, applyMiddleware } from 'redux'; import thunk from 'redux-thunk'; import counterReducer from './reducer'; const store = createStore( counterReducer, applyMiddleware(thunk) ); export default store; ``` ##### 编写异步Action 现在,你可以编写返回函数的action creators来处理异步操作了: ```javascript // actions.js export const fetchCount = () => async dispatch => { try { const response = await fetch('https://api.example.com/count'); const data = await response.json(); dispatch({ type: 'SET_COUNT', payload: data.count }); } catch (error) { console.error('Error fetching count:', error); } }; // 需要更新reducer以处理SET_COUNT action ``` 通过这一章,我们深入探讨了如何在React应用中构建Redux store,包括Redux的基础概念、如何在React组件中使用Redux store、以及如何通过Redux Thunk中间件来处理异步操作。掌握这些技能后,你将能够更有效地管理React应用中的状态,构建出更加复杂和健壮的前端应用。
上一篇:
10.4构建一个计数器
下一篇:
10.6Redux的核心
该分类下的相关小册推荐:
React全家桶--前端开发与实例(上)
深入学习React实战进阶
剑指Reactjs
ReactJS面试指南
React 进阶实践指南