React 手册
一、React 简介
1.1. React 的起源和目标
- React 诞生的背景:传统网页开发的痛点 (例如 DOM 操作复杂、代码难以维护等)
- React 的目标:提供一种高效、灵活、可维护的构建用户界面的方式
1.2. React 的核心概念
- 组件化开发:将用户界面拆分成独立的、可复用的组件
- JSX:使用 JavaScript 语法编写 HTML 结构,提高代码可读性和可维护性
- Props:用于传递数据给组件,实现组件之间的通信
- State:用于管理组件内部的状态,实现动态更新
- 虚拟 DOM:React 使用虚拟 DOM 来优化 DOM 操作,提高性能
1.3. React 的优势
- 提高开发效率:组件化开发、虚拟 DOM 等特性简化了开发流程
- 增强代码可维护性:组件化开发、JSX 语法等特性提高了代码可读性和可维护性
- 提升用户体验:虚拟 DOM 优化了 DOM 操作,提高了页面性能和用户体验
- 丰富的生态系统:React 拥有丰富的社区和生态系统,提供各种工具和库
二、创建 React 项目
2.1. 使用 Create React App 快速创建项目
- Create React App 的优势:快速搭建项目、提供开箱即用的配置、方便部署
- Create React App 的基本命令和使用
- Create React App 项目结构和基本文件介绍
2.2. 手动创建 React 项目
- 手动创建项目的步骤:创建项目目录、配置 webpack、安装依赖等
- 手动创建项目的优势:更灵活的配置、更深入的理解项目结构
- 手动创建项目的挑战:需要掌握 webpack 等工具的配置
三、React 组件
3.1. 函数式组件和类组件
- 函数式组件:使用函数定义组件,更简洁、更易于理解
- 类组件:使用类定义组件,可以实现更复杂的功能,例如生命周期方法
- React.FC:函数式组件的 TypeScript 类型,提供更好的类型检查
- FC 是 FunctionComponent 的缩写
- 自动包含了 children 属性类型
- 提供更好的 IDE 支持和类型提示
- 示例:typescript
interface Props { name: string; age: number; } const MyComponent: React.FC<Props> = ({ name, age, children }) => { return ( <div> <p>Name: {name}</p> <p>Age: {age}</p> {children} </div> ); };
3.2. React.Fragment 和组件包装
- React.Fragment:一个特殊的组件,用于在不添加额外 DOM 节点的情况下包装多个子元素
- 解决了组件必须返回单个根元素的限制
- 可以使用短语法
<>...</>
或完整语法<React.Fragment>...</React.Fragment>
- Fragment 可以接收 key 属性(仅在完整语法中)
- 示例:jsx
// 使用短语法 const ListItems = () => ( <> <li>Item 1</li> <li>Item 2</li> </> ); // 使用完整语法(当需要key时) const Items = items.map(item => ( <React.Fragment key={item.id}> <dt>{item.term}</dt> <dd>{item.description}</dd> </React.Fragment> ));
3.3. 组件的渲染和更新
- 组件的渲染过程:React 如何将组件渲染到页面上
- 组件的更新过程:React 如何更新组件的状态和视图
- React 的虚拟 DOM 和 diff 算法
3.4. Props 的传递和使用
- Props 的概念和作用:用于传递数据给组件,实现组件之间的通信
- Props 的传递方式:在父组件中传递 Props 给子组件
- Props 的使用:在子组件中访问和使用 Props
3.5. State 的管理和更新
- State 的概念和作用:用于管理组件内部的状态,实现动态更新
- State 的初始化:在组件中定义 State
- State 的更新:使用 setState 方法更新 State
- State 的最佳实践:避免直接修改 State、使用 setState 方法更新 State 等
3.6. 组件的生命周期方法
- 生命周期方法的概念和作用:在组件的不同阶段执行特定的操作
- 常用的生命周期方法:constructor、componentDidMount、componentDidUpdate、componentWillUnmount 等
- 生命周期方法的应用场景:例如在组件挂载时获取数据、在组件更新时执行特定的操作等
3.7. 组件的组合和复用
- 组件的组合:将多个组件组合在一起,构建更复杂的界面
- 组件的复用:将相同的组件代码复用,提高开发效率
- 组件的最佳实践:使用 Props 传递数据、使用 State 管理状态等
四、事件处理
4.1. 事件处理的基本语法
- 使用事件监听器处理事件
- 事件处理函数的定义和使用
4.2. 事件冒泡和事件捕获
- 事件冒泡:事件从最内层元素向外层元素传播
- 事件捕获:事件从最外层元素向内层元素传播
- 事件冒泡和事件捕获的应用场景:例如阻止事件冒泡、控制事件传播方向等
4.3. 事件处理的最佳实践
- 使用事件委托提高性能
- 避免使用 inline 事件处理函数
- 使用事件处理函数的最佳实践:例如使用箭头函数、避免使用 this 等
五、样式管理
5.1. 内联样式
- 内联样式的概念和使用:直接在 JSX 中使用 style 属性设置样式
- 内联样式的优缺点:方便快捷,但难以维护
5.2. CSS Modules
- CSS Modules 的概念和使用:将 CSS 文件模块化,避免全局命名冲突
- CSS Modules 的优势:提高代码可维护性、避免样式冲突
5.3. Styled Components
- Styled Components 的概念和使用:使用 JavaScript 编写 CSS 样式,并与组件紧密结合
- Styled Components 的优势:提高代码可读性、方便复用样式
5.4. Emotion
- Emotion 的概念和使用:一个轻量级的 CSS-in-JS 库,提供多种样式管理方式
- Emotion 的优势:灵活、高效、易于使用
六、React Hooks
6.1. Hooks 的概念和作用
- Hooks 的概念:允许在函数式组件中使用状态和生命周期方法
- Hooks 的作用:简化代码、提高组件的可复用性
6.2. 常用 Hooks:useState、useEffect、useContext、useRef 等
- useState:用于管理组件内部的状态
- useEffect:用于处理副作用,例如获取数据、设置定时器等
- useContext:用于访问 React 的 Context API
- useRef:用于创建对 DOM 元素的引用
6.3. 自定义 Hooks
- 自定义 Hooks 的概念和作用:封装常用的逻辑,提高代码复用性
- 自定义 Hooks 的示例:例如封装一个获取数据的 Hook
6.4. Hooks 的最佳实践
- 避免在循环中使用 Hooks
- 避免在条件语句中使用 Hooks
- 使用 Hooks 的最佳实践:例如使用自定义 Hooks、避免过度使用 Hooks 等
七、React Router
7.1. React Router 的基本概念和使用
- React Router 的概念:用于构建单页面应用程序 (SPA) 的路由库
- React Router 的基本使用:配置路由、匹配路由、渲染组件
7.2. 路由配置和匹配
- 路由配置:定义路由规则,例如路径、组件等
- 路由匹配:根据 URL 匹配相应的路由规则
7.3. 路由参数和查询参数
- 路由参数:在 URL 中传递参数,例如 /user/:id
- 查询参数:在 URL 中传递查询参数,例如 /search?q=react
7.4. 嵌套路由和动态路由
- 嵌套路由:将路由嵌套,实现更复杂的路由结构
- 动态路由:根据 URL 动态渲染组件
7.5. React Router 的最佳实践
- 使用 React Router 的最佳实践:例如使用嵌套路由、使用动态路由等
八、状态管理
8.1. 状态管理的必要性
- 状态管理的挑战:当应用程序变得复杂时,管理状态会变得困难
- 状态管理的目标:简化状态管理,提高代码可维护性
8.2. Context API 的使用
- Context API 的概念和作用:用于在组件树中共享数据
- Context API 的基本使用:创建 Context、提供 Context、使用 Context
- Context API 的应用场景:例如在应用程序中共享主题、语言等信息
8.3. Redux 的基本概念和使用
- Redux 的概念:一个可预测的状态管理库,用于管理应用程序的全局状态
- Redux 的基本使用:创建 Store、定义 Action、编写 Reducer、连接组件
8.4. Redux 的核心概念:Action、Reducer、Store
- Action:描述发生了什么事件
- Reducer:根据 Action 更新 State
- Store:保存 State,并提供更新 State 的方法
8.5. Redux 中间件和数据流
- Redux 中间件:用于扩展 Redux 的功能,例如异步操作、日志记录等
- Redux 数据流:Action -> Reducer -> Store -> 组件
8.6. MobX 的基本概念和使用
- MobX 的概念:一个基于观察者模式的状态管理库,更加灵活易用
- MobX 的基本使用:定义可观察对象、使用观察者模式更新状态
8.7. 状态管理的最佳实践
- 选择合适的状态管理方案:根据应用程序的复杂程度选择合适的方案