首页
技术小册
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全家桶--前端开发与实例(下)
### 12.5 使用react-redux库创建容器组件 在React应用开发中,随着应用复杂度的提升,状态管理变得尤为关键。Redux作为一个可预测化的状态容器,为JavaScript应用(特别是React应用)提供了一种集中管理状态的方式。而`react-redux`库则是Redux官方提供的React绑定库,它让Redux与React应用更加紧密地集成,简化了Redux在React中的使用。本章节将深入探讨如何使用`react-redux`库来创建容器组件(Container Components),这是将Redux的state和actions映射到React组件的关键步骤。 #### 12.5.1 理解容器组件与展示组件 在React+Redux架构中,组件通常被分为两类:展示组件(Presentational Components)和容器组件(Container Components)。 - **展示组件**:负责UI的渲染,它接收props并返回React元素。展示组件不关心数据如何加载或状态如何变化,它只关心如何将接收到的数据展示给用户。它们应该是纯函数,不维护内部状态,不执行副作用操作,并且其输出完全由props决定。 - **容器组件**:负责管理数据和行为,即它们知道如何与Redux store交互,并将这些数据和行为作为props传递给展示组件。容器组件不直接渲染UI,而是通过组合其他组件(主要是展示组件)来形成更复杂的UI结构。 #### 12.5.2 安装react-redux 首先,确保你的项目中已经安装了Redux。接着,通过npm或yarn安装`react-redux`: ```bash npm install react-redux # 或者 yarn add react-redux ``` #### 12.5.3 Provider组件 在使用`react-redux`时,你需要将Redux的store通过`Provider`组件包裹在你的React应用的根组件上。这样,应用中的任何组件都能通过`connect`函数访问到Redux store中的状态。 ```jsx import React from 'react'; import ReactDOM from 'react-dom'; import { Provider } from 'react-redux'; import store from './store'; // 假设你已经有了一个配置好的Redux store import App from './App'; ReactDOM.render( <Provider store={store}> <App /> </Provider>, document.getElementById('root') ); ``` #### 12.5.4 使用connect函数创建容器组件 `react-redux`提供的`connect`函数是创建容器组件的核心。`connect`函数接受两个可选参数:`mapStateToProps`和`mapDispatchToProps`,它们分别定义了如何将Redux store中的state和actions映射到组件的props上。 - **mapStateToProps**:一个函数,接收Redux store的state作为参数,并返回一个对象。这个对象的属性会被作为props传递给被包装的组件(即展示组件)。 - **mapDispatchToProps**:一个函数(或对象),用于将Redux actions作为props传递给被包装的组件。如果传递的是一个对象,`react-redux`会自动使用`bindActionCreators`将action creators绑定到dispatch上。 ##### 示例:创建一个简单的计数器容器组件 假设我们有一个Redux的reducer来处理计数器的状态: ```javascript // counterReducer.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; } } ``` 现在,我们创建一个容器组件来管理这个计数器的状态: ```jsx // CounterContainer.js import React from 'react'; import { connect } from 'react-redux'; import Counter from './Counter'; // 假设我们有一个展示组件Counter // mapStateToProps函数 const mapStateToProps = state => ({ count: state.count // 假设Redux的state中有一个count属性 }); // mapDispatchToProps对象 const mapDispatchToProps = { increment: () => ({ type: 'INCREMENT' }), decrement: () => ({ type: 'DECREMENT' }) }; // 使用connect函数创建容器组件 const CounterContainer = connect( mapStateToProps, mapDispatchToProps )(Counter); export default CounterContainer; ``` 在上面的例子中,`CounterContainer`是一个容器组件,它通过`connect`函数接收Redux store中的`count`状态以及`increment`和`decrement`两个action creators。然后,它将这些props传递给`Counter`展示组件,由`Counter`组件负责具体的UI渲染。 #### 12.5.5 深入connect函数 `connect`函数不仅限于简单的state和action的映射,它还提供了额外的功能,如性能优化(通过`shouldComponentUpdate`)和更细粒度的控制(如`ownProps`的使用)。 - **性能优化**:默认情况下,每当Redux store中的state发生变化时,所有使用`connect`的组件都会重新渲染。但是,如果组件只依赖于state的一部分,你可以通过返回一个新的对象来优化这个行为,该对象只包含你关心的state字段。 - **ownProps**:`mapStateToProps`和`mapDispatchToProps`都可以接收第二个参数`ownProps`,即组件自身的props。这允许你根据组件的props来动态地映射state和actions。 #### 12.5.6 小结 通过`react-redux`库的`connect`函数,我们可以轻松地创建容器组件,将Redux的state和actions以props的形式传递给React组件,从而实现了Redux与React的紧密结合。容器组件和展示组件的分离,使得React应用的逻辑更加清晰,状态管理更加集中和可预测。在实际开发中,合理应用这一模式,将大大提升应用的可维护性和可扩展性。
上一篇:
12.4从App组件中移除store
下一篇:
12.6动作创建器
该分类下的相关小册推荐:
React全家桶--前端开发与实例(上)
React 进阶实践指南
ReactJS面试指南
剑指Reactjs
深入学习React实战进阶