React组件生命周期完全指南
创作时间:
作者:
@小白创作中心
React组件生命周期完全指南
引用
CSDN
1.
https://blog.csdn.net/qq_44214428/article/details/143454732
React组件的生命周期是指组件从创建、更新到销毁的整个过程。合理地使用生命周期方法可以让我们更好地控制组件的行为,优化性能,并处理副作用。本文将详细介绍React组件的生命周期,包括生命周期的三个阶段(挂载、更新、卸载)、常用生命周期方法的使用场景、最佳实践以及新旧生命周期的变化。
一、生命周期概述
React 组件的生命周期是指组件从创建、更新到销毁的整个过程。合理地使用生命周期方法可以让我们更好地控制组件的行为,优化性能,并处理副作用。
二、生命周期的三个阶段
2.1 挂载阶段(Mounting)
组件实例被创建并插入 DOM 的过程
class MyComponent extends React.Component {
// 1. 构造函数
constructor(props) {
super(props);
this.state = { count: 0 };
console.log('1. constructor');
}
// 2. 静态方法,很少使用
static getDerivedStateFromProps(props, state) {
console.log('2. getDerivedStateFromProps');
return null;
}
// 3. 渲染方法
render() {
console.log('3. render');
return <div>{this.state.count}</div>;
}
// 4. 挂载完成
componentDidMount() {
console.log('4. componentDidMount');
}
}
2.2 更新阶段(Updating)
当组件的 props 或 state 发生变化时触发更新
class MyComponent extends React.Component {
// 1. 静态方法
static getDerivedStateFromProps(props, state) {
return null;
}
// 2. 是否应该更新
shouldComponentUpdate(nextProps, nextState) {
return true;
}
// 3. 渲染
render() {
return <div>{this.state.count}</div>;
}
// 4. 获取更新前的快照
getSnapshotBeforeUpdate(prevProps, prevState) {
return null;
}
// 5. 更新完成
componentDidUpdate(prevProps, prevState, snapshot) {
// 处理更新后的操作
}
}
2.3 卸载阶段(Unmounting)
组件从 DOM 中移除的过程
class MyComponent extends React.Component {
componentWillUnmount() {
// 清理工作,比如清除定时器、取消订阅等
console.log('组件即将卸载');
}
}
三、常用生命周期方法详解
3.1 constructor(构造函数)
constructor(props) {
super(props);
// 初始化状态
this.state = {

count: 0,
data: []
};
// 绑定方法
this.handleClick = this.handleClick.bind(this);
}
使用场景:
- 初始化组件的 state
- 绑定事件处理方法
- 不要在这里调用 setState
- 避免在这里执行副作用操作
3.2 componentDidMount
componentDidMount() {
// 发起网络请求
fetch('api/data')
.then(res => res.json())
.then(data => {
this.setState({ data });
});
// 添加事件监听
window.addEventListener('resize', this.handleResize);
// 设置定时器
this.timer = setInterval(() => {
this.setState(state => ({
count: state.count + 1
}));
}, 1000);
}
使用场景:
- 发起网络请求
- DOM 操作
- 添加订阅
- 设置定时器
3.3 componentDidUpdate
componentDidUpdate(prevProps, prevState, snapshot) {
// 比较 props 变化
if (this.props.userID !== prevProps.userID) {
this.fetchData(this.props.userID);
}
// 比较 state 变化
if (this.state.count !== prevState.count) {
document.title = `点击次数:${this.state.count}`;
}
}
使用场景:
- 对比更新前后的数据
- 根据条件执行副作用
- 注意避免无限循环
3.4 componentWillUnmount
componentWillUnmount() {
// 清除定时器
clearInterval(this.timer);
// 移除事件监听
window.removeEventListener('resize', this.handleResize);
// 取消订阅
this.subscription.unsubscribe();
}
使用场景:
- 清理定时器
- 取消网络请求
- 清除事件监听
- 取消订阅
四、生命周期的最佳实践
4.1 性能优化
class OptimizedComponent extends React.Component {
shouldComponentUpdate(nextProps, nextState) {
// 只在必要时更新
return (
this.props.value !== nextProps.value ||
this.state.count !== nextState.count
);
}
render() {
return (
<div>
<h1>{this.props.value}</h1>
<p>{this.state.count}</p>
</div>
);
}
}
4.2 错误处理
class ErrorBoundary extends React.Component {
state = { hasError: false };
static getDerivedStateFromError(error) {
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// 记录错误日志
console.error('错误信息:', error);
console.error('错误详情:', errorInfo);
}
render() {
if (this.state.hasError) {
return <h1>出错了!</h1>;
}
return this.props.children;
}
}
五、新旧生命周期的变化
5.1 已废弃的生命周期方法
- componentWillMount
- componentWillReceiveProps
- componentWillUpdate
5.2 新增的生命周期方法
- getDerivedStateFromProps
- getSnapshotBeforeUpdate
六、Hooks 时代的生命周期
function HooksComponent() {
// 相当于 constructor 和 componentDidMount
const [count, setCount] = useState(0);
// 相当于 componentDidMount 和 componentDidUpdate
useEffect(() => {
document.title = `点击次数:${count}`;
}, [count]);
// 相当于 componentDidMount 和 componentWillUnmount
useEffect(() => {
const handler = () => console.log('窗口大小改变');
window.addEventListener('resize', handler);
// 清理函数
return () => {
window.removeEventListener('resize', handler);
};
}, []);
return <div>计数:{count}</div>;
}
七、总结
React 生命周期方法为我们提供了在组件不同阶段执行代码的机会。合理使用这些方法可以:
- 优化组件性能
- 正确处理副作用
- 管理组件状态
- 避免内存泄漏
在实际开发中,最常用的生命周期方法是:
- constructor:初始化
- componentDidMount:副作用处理
- componentDidUpdate:更新后的操作
- componentWillUnmount:清理工作
随着 React Hooks 的普及,函数组件正在逐渐取代类组件。但理解生命周期概念对于深入理解 React 的工作原理仍然至关重要。
本文原文来自CSDN
热门推荐
衡阳蒸湘区红湘街道卫生服务中心开设夜间门诊,提升居民就医体验
备孕前检查项目及注意事项
五一5天小长假确定,你将怎么度过?不同人群与领域的多样变奏
左肺上叶钙化灶的可能原因及临床意义
网上预约挂号诊断证明怎么拿?
人不会无缘无故长红斑?发现:长红斑的人,背后或有四个原因
利用路由器零成本快速搭建家庭局域网存储
怎么分辨建水紫陶真假,紫陶怎么辨别优劣?
重整制氢在清洁能源中的应用
嗓子总是沙哑怎么办
USNews世界大学排名:韩国篇完整版,世宗大学赶超汉阳大学!
建设工程设计合同纠纷案件管辖地如何确定?
如何设计一个高效的绩效系统以提升团队整体表现?
搭机长途旅行太累,如何挑选最舒服经济舱座位?
天津地铁7号线最新动态:鼓楼站设计细节公布,年内将实现通车
头上冒出白头发,你最该做的事情只有一件!
专家提醒:辅酶Q10不是“万能护心丸”,这些才是预防心血管疾病的正确方式
北宋繁荣背后的衰落原因
“量变”变“质变”,工业革命爆发,资本主义经济瞬息万变
2025重庆周边深度游攻略:山水人文与在地体验全指南
高透光膜材透光率的标准及选择
国际交往中的礼仪文化
Win11开机自启动管理怎么做?如何有效管理自启动程序?
再读奥威尔与《1984》:关于未来极权社会图景和人性扭曲的寓言
疤痕凸起怎么办?一文详解成因、治疗与护理方式
基金费用的构成因素有哪些?这些因素如何影响投资收益?
经济形势对股市的影响是什么?这种影响如何进行评估?
友谊的意义与价值:如何维系并应对现代挑战?
天然精油功效 - 驅蚊防蟲篇
世界首次万米特深渗透率测井:从0到1推动油气勘探迈出新步伐