首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 课程介绍
02 | React出现的历史背景及特性介绍
03 | 以组件方式考虑UI的构建
04 | JSX的本质 : 不是模板引擎,而是语法糖
05 | React组件的生命周期及其使用场景
06 | 理解Virtual DOM及key属性的作用
07 | 组件设计模式 : 高阶组件和函数作为子组件
08 | 理解新的Context API及其使用场景
09 | 使用脚手架工具创建React项目
10 | 打包和部署
11 | Redux(1) : 前端为何需要状态管理库
12 | Redux(2) : 深入理解Store、Action、Reducer
13 | Redux(3) : 在React中使用Redux
14 | Redux(4) : 理解异步Action、Redux中间件
15 | Redux(5) : 如何组织Action和Reducer
16 | Redux(6) : 理解不可变数据(Immutability)
17 | React Router(1):路由不只是页面切换,更是代码组织方式
18 | React Router(2):参数定义,嵌套路由的使用场景
19 | UI组件库对比和介绍:Ant.Design、Material UI、Semantic UI
20 | 使用Next.js创建React同构应用
21 | 使用Jest、Enzyme等工具进行单元测试
22 | 常用开发调试工具:ESLint、Prettier、React DevTool、Redux DevTool
23 | 前端项目的理想架构:可维护、可扩展、可测试、易开发、易建构
24 | 拆分复杂度(1):按领域模型(feature)组织代码,降低耦合度
25 | 拆分复杂度(2):如何组织component、action和reducer
26 | 拆分复杂度(3):如何组织React Router的路由配置
27 | 使用Rekit(1):创建项目,代码生成和重构
28 | 使用Rekit(2):遵循最佳实践,保持代码一致性
29 | 使用React Router管理登录和授权
30 | 实现表单(1):初始数据,提交和跳转
31 | 实现表单(2):错误处理,动态表单元素,内容动态加载
32 | 列表页(1):搜索,数据缓存和分页
33 | 列表页(2):缓存更新,加载状态,错误处理
34 | 页面数据需要来源多个请求的处理
35 | 内容页的加载与缓存
36 | 基于React Router实现分步操作
37 | 常见页面布局的实现
38 | 使用React Portals实现对话框,使用antd对话框
39 | 集成第三方JS库:以d3.js为例
40 | 基于路由实现菜单导航
41 | React中拖放的实现
42 | 性能永远是第一需求:时刻考虑性能问题
43 | 网络性能优化:自动化按需加载
44 | 使用Reselect避免重复计算
45 | 下一代React:异步渲染
46 | 使用Chrome DevTool进行性能调优&结课测试
当前位置:
首页>>
技术小册>>
深入学习React实战进阶
小册名称:深入学习React实战进阶
### 25 | 拆分复杂度(2):如何组织Component、Action和Reducer 在React与Redux结合开发大型应用时,随着功能的不断增加,应用的复杂度也会显著提升。合理地组织组件(Component)、动作(Action)和规约(Reducer)成为保持代码清晰、可维护性高的关键。本章将深入探讨如何在React项目中,特别是在使用Redux进行状态管理时,有效地拆分并组织这些关键元素,以应对日益增长的复杂度。 #### 一、引言 在React应用中,组件是构建用户界面的基石,而Redux则负责应用的状态管理。随着应用的增长,单一的大型组件、动作或规约文件会迅速变得难以管理和维护。因此,通过合理的拆分和组织策略,可以显著提升代码的可读性、可测试性和可扩展性。 #### 二、组件的组织 ##### 2.1 组件拆分原则 1. **单一职责原则**:确保每个组件只负责一项任务或展示一小块UI。这样做有助于保持组件的简洁和独立,便于重用和维护。 2. **高内聚低耦合**:组件内部逻辑应高度相关,而组件间依赖应尽可能减少。通过props传递数据和回调函数实现组件间的通信,避免直接修改其他组件的状态。 3. **按功能或页面划分**:将具有相似功能或属于同一页面的组件组织在一起,形成清晰的目录结构。 ##### 2.2 组件目录结构示例 ```plaintext src/ |-- components/ | |-- Button/ | | |-- index.js | | |-- Button.styled.js | |-- Form/ | | |-- index.js | | |-- Form.styled.js | |-- PageHeader/ | | |-- index.js | | |-- PageHeader.styled.js | |-- ... |-- pages/ | |-- HomePage/ | | |-- index.js | | |-- HomePage.styled.js | | |-- components/ | | |-- HeroSection/ | | |-- FeatureList/ | | |-- ... | |-- AboutPage/ | |-- ... |-- ... ``` #### 三、动作(Action)的组织 ##### 3.1 动作类型(Action Types) - **常量化**:动作类型应使用常量表示,并集中管理在一个或多个文件中,以便于查找和引用。 - **命名空间**:为不同模块或功能的动作类型添加前缀,避免命名冲突。 ##### 3.2 动作创建函数(Action Creators) - **函数封装**:将创建动作对象的逻辑封装在函数中,提高复用性和可读性。 - **参数化**:通过参数化动作创建函数,使其能够根据不同的输入生成不同的动作对象。 ##### 3.3 目录结构示例 ```plaintext src/ |-- actions/ | |-- types.js # 集中管理所有动作类型 | |-- userActions.js # 处理与用户相关的动作 | |-- productActions.js # 处理与产品相关的动作 | ... ``` #### 四、规约(Reducer)的组织 ##### 4.1 规约的职责 - **纯函数**:规约必须是纯函数,即给定相同的输入(当前状态和动作),它总是产生相同的输出(新状态)。 - **单一职责**:每个规约应专注于处理应用状态的一部分。 ##### 4.2 规约拆分 - **按功能拆分**:将状态管理拆分成多个小的规约,每个规约管理应用状态的一部分。 - **组合规约**:使用Redux的`combineReducers`函数将多个规约组合成一个单一的根规约,用于管理整个应用的状态。 ##### 4.3 规约目录结构示例 ```plaintext src/ |-- reducers/ | |-- index.js # 使用combineReducers组合所有规约 | |-- userReducer.js # 处理与用户相关的状态 | |-- productReducer.js # 处理与产品相关的状态 | ... ``` #### 五、高级组织策略 ##### 5.1 使用Redux Middleware - **中间件**:Redux中间件提供了一种强大的方式来扩展Redux的功能,如异步操作、日志记录等。通过中间件,可以在发送动作到规约之前或之后执行额外的逻辑。 - **使用场景**:如使用`redux-thunk`或`redux-saga`处理异步逻辑,`redux-logger`记录动作和状态变化等。 ##### 5.2 模块化Redux Store - **分割Store**:对于极其复杂的应用,考虑将Redux Store分割成多个小的、独立的Store,每个Store管理应用的一个特定部分。然后,使用如`redux-subspace`这样的库来管理这些子Store之间的通信和同步。 ##### 5.3 组件与Redux的解耦 - **React Redux Hooks**:利用`useSelector`和`useDispatch`等Hooks,可以在不直接引用Redux Store或`connect`高阶组件的情况下,从组件中访问状态和分发动作,从而减少组件与Redux的耦合度。 #### 六、总结 在React与Redux结合的大型应用中,合理地组织组件、动作和规约是提升代码质量和可维护性的关键。通过遵循单一职责原则、高内聚低耦合、按功能或页面划分等策略,可以有效地拆分并管理应用的复杂度。同时,利用Redux中间件、模块化Store和React Redux Hooks等高级技术,可以进一步提升应用的性能和可维护性。记住,良好的组织结构和清晰的代码结构是构建高质量软件的基础。
上一篇:
24 | 拆分复杂度(1):按领域模型(feature)组织代码,降低耦合度
下一篇:
26 | 拆分复杂度(3):如何组织React Router的路由配置
该分类下的相关小册推荐:
React 进阶实践指南
剑指Reactjs
React全家桶--前端开发与实例(下)
React全家桶--前端开发与实例(上)
ReactJS面试指南