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

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对生命周期的替代逻辑。
http://www.xdnf.cn/news/2087.html

相关文章:

  • Float32、Float16、BFloat16
  • 【KWDB 创作者计划】_深度学习篇---数据获取
  • 一篇速成Linux 设置位 S(SetUID)
  • 欧拉计划 Project Euler56(幂的数字和)题解
  • SAP ABAP S/4新语法
  • python代做推荐系统深度学习知识图谱c#代码代编神经网络算法创新
  • ai聊天流式响应,阻塞式和流式响应 nginx遇到的坑
  • c#加密证件号的中间部分,改为*号
  • Flask 请求数据获取方法详解
  • 信息学奥赛一本通 1509:【例 1】Intervals | OpenJudge 百练 1201:Intervals
  • NLP高频面试题(五十四)——深度学习归一化详解
  • 使用npm install或cnpm install报错解决
  • 鼠标指定范围内随机点击
  • websheet之 编辑器
  • PyTorch与CUDA的关系
  • Android——Activity与Fragment通信
  • Asp.Net Core 异常筛选器ExceptionFilter
  • Python教程(一)——Python速览
  • 白鲸开源与亚马逊云科技携手推动AI-Ready数据架构创新
  • <论文>(谷歌)用于时序链接预测的迁移学习
  • Asp.Net Core 基于(asp.net core 2.2) 创建asp .net core空项目
  • vite+vue2+elementui构建之 package.json
  • 深度解析:从12306看混合云架构下的高并发系统设计
  • Z-Wave正通过自我革新,重塑在智能家居领域新定位
  • 2025年的营销趋势-矩阵IP
  • (Go Gin)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
  • 数据湖DataLake和传统数据仓库Datawarehouse的主要区别是什么?优缺点是什么?
  • FlinkSql入门与实践
  • Linux文件管理完全指南:从命名规则到压缩解压
  • OpenHarmony - 小型系统内核(LiteOS-A)(十),魔法键使用方法,用户态异常信息说明