当前位置: 首页 > news >正文

React类组件与React Hooks写法对比


React 类组件 vs Hooks 写法对比

分类类组件(Class Components)函数组件 + Hooks
组件定义class Component extends React.Componentconst Component = () => {}
状态管理this.state + this.setState()useState()
生命周期componentDidMount, componentDidUpdateuseEffect(() => {}, [deps])
副作用处理分散在多个生命周期方法中集中在useEffect中,通过依赖数组控制执行时机
上下文(Context)static contextType<Context.Consumer>useContext()
RefscreateRef() + this.myRefuseRef()
方法绑定需要手动绑定this(或在构造函数中绑定)无需绑定,直接使用箭头函数或函数声明
代码结构基于类的继承,逻辑分散在生命周期方法中函数式编程,逻辑按功能聚合,可自定义Hook复用
状态更新this.setState({ key: value })(自动合并对象)setState(newValue)(直接替换状态,需手动合并对象)
路由(v5及以前)通过this.props.history访问路由使用useHistory, useLocation等Hooks
高阶组件(HOC)常用HOC增强组件功能可用HOC,但更推荐自定义Hook替代
性能优化PureComponentshouldComponentUpdateReact.memo + useMemo/useCallback

核心代码示例对比

1. 状态管理
// 类组件
class Counter extends React.Component {state = { count: 0 };increment = () => {this.setState({ count: this.state.count + 1 });};render() {return <button onClick={this.increment}>{this.state.count}</button>;}
}// Hooks
const Counter = () => {const [count, setCount] = useState(0);const increment = () => setCount(count + 1);return <button onClick={increment}>{count}</button>;
};
2. 生命周期/副作用
// 类组件
class DataFetcher extends React.Component {componentDidMount() {fetchData().then(data => this.setState({ data }));}componentDidUpdate(prevProps) {if (prevProps.id !== this.props.id) {fetchData(this.props.id).then(data => this.setState({ data }));}}
}// Hooks
const DataFetcher = ({ id }) => {const [data, setData] = useState(null);useEffect(() => {fetchData(id).then(setData);}, [id]); // 依赖数组控制重新执行
};
3. 上下文(Context)
// 类组件
class UserInfo extends React.Component {static contextType = UserContext;render() {const user = this.context;return <div>{user.name}</div>;}
}// Hooks
const UserInfo = () => {const user = useContext(UserContext);return <div>{user.name}</div>;
};
4. Refs
// 类组件
class InputFocuser extends React.Component {inputRef = React.createRef();focusInput = () => this.inputRef.current.focus();render() {return <input ref={this.inputRef} />;}
}// Hooks
const InputFocuser = () => {const inputRef = useRef(null);const focusInput = () => inputRef.current.focus();return <input ref={inputRef} />;
};

关键总结

  1. 类组件:面向对象风格,强依赖于this和生命周期方法,适合复杂状态逻辑或需要精确控制生命周期的场景。
  2. Hooks:函数式编程风格,逻辑更聚合,避免this绑定问题,代码更简洁,适合逻辑复用和现代React开发。
  3. 迁移建议:新项目优先使用Hooks,旧项目逐步迁移时注意useEffect对生命周期的替代逻辑。

相关文章:

  • STM32 I2C总线通信协议
  • Gartner魔力象限(Gartner Magic Quadrant)
  • 统计文件中单词出现的次数并累计
  • van-field组件设置为textarea属性被软键盘遮挡问题
  • Qt基础009(HTTP编程和QJSON)
  • Linux阻塞与非阻塞I/O:从原理到实践详解
  • js中get,set用法
  • 深度学习 视觉处理(CNN) day_02
  • 力扣-206.反转链表
  • SecMulti-RAG:兼顾数据安全与智能检索的多源RAG框架,为企业构建不泄密的智能搜索引擎
  • 在 Spring Boot 项目中如何使用索引来优化 SQL 查询?
  • 再见,物理删除!MyBatis-Plus @TableLogic 优雅实现逻辑删除
  • 【ESP32S3】 下载时遇到 libusb_open() failed 解决方案
  • python如何取消word中的缩进
  • Unity3D IK解算器技术分析
  • 基于AIGC的3D场景生成实战:从文本描述到虚拟世界构建
  • BT150-ASEMI机器人率器件专用BT150
  • OceanBase 跻身 Forrester 三大领域代表厂商,全面支撑AI场景
  • 【C++游戏引擎开发】第24篇:级联阴影映射(CSM,Cascaded Shadow Maps)
  • springboot3 声明式 HTTP 接口
  • 马上评丨马拉松“方便门”被处罚,是一针清醒剂
  • 往事|学者罗继祖王贵忱仅有的一次相见及往来函札
  • 海上生明月,九天揽星河,2025年“中国航天日”主场活动在上海启动
  • 视频丨习近平同阿塞拜疆总统会谈:两国建立全面战略伙伴关系
  • 上海又一住宅新盘“日光”!今年已有9个新房项目触发积分
  • 美股再遭重挫,标普500指数11个板块全线溃败