展示组件和容器组件

react-redux绑定库是基于容器组件和展示组件分离的开发思想,是react开发中非常重要的一个思想。

详细介绍可以查看本文

#展示组件和容器组件对比

展示组件容器组件
作用描述如何展现(骨架、样式)描述如何运行(数据获取、状态更新)
直接使用 Redux
数据来源props监听 Redux state
数据修改从 props 调用回调函数想 Redux 派发actions
调用方式手动通常由 React Redux 生成

进行组件分离的好处

1.更好地分散注意力。通过这样写组件能更好地理解你的 app 和 UI。

2.更好地重用。你可以使用同样的表式组件配合完全不同的状态源,并在未来重用这些分离的容器组件。

3.展示组件对你 APP 的“调色”是很有必要的。你可以把它们放在单页里,并让设计师在不触碰逻辑的情况下自由地调整配色。

4.这强迫你抽出类似于:Sidebar,Page,ContextMenu,这样的布局组件并使用 this.props.children 而不是重复在几个容器组件中同样的标记和布局。

#什么时候该引入容器组件?

我建议你一开始只使用展示组件来构建你的APP。最终你将意识到你传递了太多 props 给中间的组件。当你意识到有些组件并没有用到它们接收的 props,而只是将这些 props向下传递。在底层的组件需要更多数据时,你不得不重写所有这些中间组件,这时候就很适合引入容器组件了。通过这种方式,你可以将 props 传递给叶子节点而不增加和它无关的中层组件的负担。

提示

不要把展示组件和容器组件的划分当做教条。有些时候甚至无关紧要。如果你不确定一个组件是该定义成展示组件还是容器组件,也许是区分得太早了,不用担心。

### 展示组件容器组件的区别及最佳实践 #### 1. 定义与职责划分 展示组件(Presentational Component)专注于 UI 表现,仅接收 `props` 并将其渲染为用户界面[^2]。它们通常无状态、可复用,并且不直接与应用的状态管理工具(如 Redux 或 Vuex)交互。 容器组件(Container Component)则负责管理数据业务逻辑,通常与状态管理工具集成以获取或更新数据。容器组件将这些数据通过 `props` 传递给展示组件,并处理用户交互事件[^2]。 #### 2. 特性对比 以下是展示组件容器组件的主要特性对比: | 特性 | 展示组件 | 容器组件 | |-------------------|-----------------------------------|-----------------------------------| | **状态** | 无状态 | 状态沉重,管理应用级状态 | | **职责** | 负责 UI 表现 | 负责数据获取业务逻辑 | | **可复用性** | 高度可复用 | 较低,通常特定于某个场景 | | **依赖** | 不依赖外部库或状态管理工具 | 依赖状态管理工具(如 Redux/Vuex) | | **交互** | 不直接处理用户交互 | 处理用户交互并更新状态 | #### 3. 示例代码 以下是一个简单的 React 示例,展示了如何分离展示组件容器组件的职责: ##### 展示组件 ```javascript // UserList.js import React from 'react'; const UserList = ({ users }) => ( <ul> {users.map(user => ( <li key={user.id}>{user.name}</li> ))} </ul> ); export default UserList; ``` ##### 容器组件 ```javascript // UserListContainer.js import React, { useEffect, useState } from 'react'; import UserList from './UserList'; const UserListContainer = () => { const [users, setUsers] = useState([]); useEffect(() => { fetch('https://api.example.com/users') .then(response => response.json()) .then(data => setUsers(data)); }, []); return <UserList users={users} />; }; export default UserListContainer; ``` 在上述代码中,`UserList` 是展示组件,仅负责渲染用户列表;而 `UserListContainer` 是容器组件,负责从 API 获取数据并通过 `props` 将其传递给展示组件[^2]。 #### 4. 最佳实践 - **职责单一原则**:确保展示组件仅关注 UI 表现,而容器组件专注于数据管理逻辑处理。 - **解耦设计**:通过分离展示组件容器组件,可以提高代码的可维护性可测试性[^2]。 - **避免突变**:在构建高阶组件(HOC)时,应避免对原始组件进行突变操作,以保持组件的纯净性[^4]。 - **使用组合而非继承**:推荐通过组合的方式扩展组件功能,而不是依赖于继承。 #### 5. 性能优化建议 - 在展示组件中使用 `React.memo` 或 Vue 的 `shouldComponentUpdate` 来避免不必要的重新渲染[^2]。 - 对于大型列表,可以考虑使用虚拟滚动技术来优化性能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值