类组件 vs 函数组件

函数组件类组件
基本语法纯 JavaScript 函数,无 this 绑定ES6 类语法,需处理 this 绑定
状态管理useState / useReducer,细粒度控制,不可变状态this.setState,批量更新,可变状态对象
生命周期useEffect 统一管理副作用,逻辑聚合显式生命周期方法(componentDidMount 等),逻辑分散
代码复杂度更简洁(减少约 40% 样板代码)需要 constructor / super 等固定结构
性能优化React.memo + useMemo / useCallbackshouldComponentUpdate + PureComponent
错误边界❌ 无法直接实现✅ 唯一实现方式(componentDidCatch
逻辑复用自定义 [[03 - 前端 Frontend/React 框架 React Framework/HooksHooks]](天然组合式复用)
TS 支持更好的类型推断(Props 直接作为函数参数)需要声明 Component<Props, State> 泛型
内存占用更优(无类实例开销)较高(每个组件生成类实例)
现代特性支持✅ 完整支持并发模式/Server Components❌ 部分特性受限(如 Suspense 数据获取)
典型应用场景- 90%+ 新组件开发
- 复杂状态逻辑(结合 Context/Redux)
- 需要逻辑复用的模块
- 错误边界组件
- 维护遗留代码
- 需要精确控制生命周期
调试难度更易追踪状态变化(闭包环境)this 上下文问题常见(需绑定方法)
测试友好度纯函数更易单元测试需要处理类实例和生命周期
未来兼容性React 官方推荐方向,持续获得新特性功能冻结,仅维护模式

关键差异场景

场景函数组件方案类组件方案
数据请求 +loadinguseEffect + useState 集中管理componentDidMount + 分散状态更新
表单处理useForm 自定义 Hook手动处理多个 setState
性能优化React.memo + useMemoshouldComponentUpdate 深度比较
全局状态useContext + useReducer高阶组件包裹 + 手动订阅
动画控制useEffect 清理副作用 + requestAnimationFramecomponentDidMount / componentWillUnmount 管理