首页
技术小册
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.1 表示组件与容器组件 在React的应用开发中,组件(Components)是构建用户界面的基石。随着项目规模的扩大,理解和应用不同类型的组件变得尤为重要。本章节将深入探讨表示组件(Presentational Components)与容器组件(Container Components)的概念、区别、以及它们如何协同工作以提升React应用的架构清晰度和可维护性。 #### 12.1.1 组件概述 在React中,组件是封装了UI逻辑的独立单元,它们可以是类组件(Class Components)或函数组件(Function Components,特别是使用Hooks之后的函数组件)。组件允许我们将UI拆分成小的、可复用的部分,每个部分都负责渲染页面的一小部分。这种拆分不仅提高了代码的可读性和可维护性,还促进了开发效率。 #### 12.1.2 表示组件(Presentational Components) **定义与特性** 表示组件,也称为“纯展示组件”或“傻瓜组件”,主要负责UI的呈现,即如何展示数据,而不关心数据从何而来或如何变化。它们接收props作为输入,并返回React元素作为输出。表示组件是无状态的(在函数组件中通过不使用Hooks保持无状态,或在类组件中不维护内部状态),这意味着它们不会直接修改数据或触发副作用,如数据获取、订阅或手动更改React组件树中的DOM。 **优点** - **易于测试**:因为它们不依赖外部状态或副作用,所以可以很容易地进行单元测试。 - **高可复用性**:相同的表示逻辑可以在不同的上下文中重用。 - **清晰的职责划分**:让UI逻辑与数据逻辑分离,有助于保持代码的清晰和模块化。 **示例** ```jsx function UserProfile({ user }) { return ( <div> <h1>{user.name}</h1> <p>{user.bio}</p> </div> ); } ``` 在这个例子中,`UserProfile`是一个表示组件,它接收一个`user`对象作为prop,并渲染用户的姓名和简介。 #### 12.1.3 容器组件(Container Components) **定义与特性** 容器组件负责处理大部分逻辑,如数据获取、状态管理和将数据传递给表示组件。它们通常是有状态的(使用Hooks或类组件中的state),并且可能使用如Redux、MobX等状态管理库来管理复杂的状态逻辑。容器组件通常不直接渲染DOM,而是渲染一个或多个表示组件,并将必要的数据和回调函数作为props传递给它们。 **优点** - **逻辑集中**:将所有与数据获取和状态管理相关的逻辑封装在一个地方,使得应用的行为更加清晰和可预测。 - **灵活性**:易于替换表示组件,而不影响应用的整体逻辑。 - **可维护性**:当应用增长时,保持逻辑的分离有助于减少代码间的耦合,从而提高可维护性。 **示例** 假设我们使用Redux作为状态管理库,下面是一个容器组件的示例: ```jsx import React, { useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { fetchUser } from './userActions'; import UserProfile from './UserProfile'; function UserContainer() { const dispatch = useDispatch(); const user = useSelector(state => state.user.data); useEffect(() => { dispatch(fetchUser()); }, [dispatch]); return ( <div> {user ? <UserProfile user={user} /> : <p>Loading...</p>} </div> ); } ``` 在这个例子中,`UserContainer`是一个容器组件,它使用Redux的`useDispatch`和`useSelector` Hooks来管理用户数据的获取和选择。当组件挂载时,它会通过dispatch一个`fetchUser` action来从服务器获取用户数据,然后将获取到的用户数据作为prop传递给`UserProfile`表示组件进行渲染。 #### 12.1.4 协同工作 在React应用中,表示组件和容器组件通常协同工作来构建用户界面。容器组件负责数据管理和逻辑处理,而表示组件则负责将这些数据以用户友好的方式展示出来。这种分离使得开发者能够更专注于各自的职责,提高了开发效率和代码质量。 此外,通过组合不同的表示组件和容器组件,可以构建出复杂且高度可复用的UI组件库,从而加速开发过程并降低维护成本。 #### 12.1.5 小结 表示组件与容器组件的划分是React应用架构中的一种重要模式,它有助于提升应用的清晰度和可维护性。表示组件专注于UI的展示,而容器组件则负责数据的获取和管理。通过明确这两种组件的角色和职责,我们可以构建出更加模块化和可复用的React应用。同时,这种划分也促进了开发团队之间的协作,使得前端开发者能够更高效地开发和维护大型应用。 在实际开发中,我们应根据具体的应用场景和需求来选择合适的组件类型,并灵活地应用它们来构建高质量的React应用。此外,随着React及其生态系统的不断发展,我们也需要持续关注新的最佳实践和工具,以不断优化我们的应用架构和代码质量。
上一篇:
11.11使用redux的combineReducers()函数
下一篇:
12.2拆分ThreadTabs组件
该分类下的相关小册推荐:
React 进阶实践指南
React全家桶--前端开发与实例(上)
ReactJS面试指南
深入学习React实战进阶
剑指Reactjs