React生命周期全解析

React 生命周期详解

React 组件的生命周期分为三个阶段:挂载(Mounting)更新(Updating)卸载(Unmouting)。每个阶段包含不同的生命周期方法,用于控制组件的渲染、更新和销毁过程。

挂载阶段(Mounting)

挂载阶段是组件首次被创建并插入 DOM 的阶段,涉及以下方法:

constructor()

构造函数在组件初始化时调用,用于初始化 state 和绑定方法。若不初始化 state 或不绑定方法,可以省略 constructor。

javascript 复制代码
class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
    this.handleClick = this.handleClick.bind(this);
  }
}

static getDerivedStateFromProps()

该方法在组件实例化或接收到新 props 时调用,返回一个对象用于更新 state,或返回 null 表示不更新。

javascript 复制代码
static getDerivedStateFromProps(props, state) {
  if (props.value !== state.prevValue) {
    return { prevValue: props.value };
  }
  return null;
}

render()

render 方法是类组件中唯一必须实现的方法,负责返回 JSX 结构。该方法必须是纯函数,不应修改 state 或与浏览器交互。

javascript 复制代码
render() {
  return <div>{this.state.count}</div>;
}

componentDidMount()

在组件挂载到 DOM 后立即调用,通常用于发起网络请求、订阅事件或操作 DOM。

javascript 复制代码
componentDidMount() {
  fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => this.setState({ data }));
}
更新阶段(Updating)

更新阶段发生在组件重新渲染时,可能由 props 或 state 的变化触发。

static getDerivedStateFromProps()

与挂载阶段相同,该方法在更新阶段也会被调用,用于根据 props 调整 state。

shouldComponentUpdate()

该方法决定组件是否需要重新渲染,默认返回 true。可通过比较新旧 props 或 state 优化性能。

javascript 复制代码
shouldComponentUpdate(nextProps, nextState) {
  return nextProps.value !== this.props.value;
}

render()

更新阶段再次调用 render 方法生成新的虚拟 DOM。

getSnapshotBeforeUpdate()

在 DOM 更新前捕获当前状态(如滚动位置),返回值将作为参数传递给 componentDidUpdate

javascript 复制代码
getSnapshotBeforeUpdate(prevProps, prevState) {
  if (prevProps.list.length < this.props.list.length) {
    return this.listRef.scrollHeight;
  }
  return null;
}

componentDidUpdate()

在组件更新后调用,适合执行 DOM 操作或网络请求。

javascript 复制代码
componentDidUpdate(prevProps, prevState, snapshot) {
  if (snapshot !== null) {
    this.listRef.scrollTop += this.listRef.scrollHeight - snapshot;
  }
}
卸载阶段(Unmounting)

componentWillUnmount()

在组件卸载前调用,用于清理定时器、取消网络请求或移除事件监听。

javascript 复制代码
componentWillUnmount() {
  clearInterval(this.timerID);
  this.subscription.unsubscribe();
}
错误处理

static getDerivedStateFromError()

在子组件抛出错误时调用,返回一个对象用于更新 state 以显示错误 UI。

javascript 复制代码
static getDerivedStateFromError(error) {
  return { hasError: true };
}

componentDidCatch()

用于记录错误信息,适合上报错误日志。

javascript 复制代码
componentDidCatch(error, info) {
  logErrorToService(error, info);
}
生命周期流程图
  1. 挂载阶段

    • constructor
    • getDerivedStateFromProps
    • render
    • componentDidMount
  2. 更新阶段

    • getDerivedStateFromProps
    • shouldComponentUpdate
    • render
    • getSnapshotBeforeUpdate
    • componentDidUpdate
  3. 卸载阶段

    • componentWillUnmount
注意事项
  • 避免副作用rendergetDerivedStateFromProps 应是纯函数,避免直接修改 state 或执行异步操作。
  • 性能优化 :合理使用 shouldComponentUpdateReact.memo 减少不必要的渲染。
  • 错误边界 :使用 getDerivedStateFromErrorcomponentDidCatch 防止组件树崩溃。

通过合理利用生命周期方法,可以更高效地管理组件状态、优化渲染性能并处理异常情况。

相关推荐
敲代码的嘎仔9 分钟前
实习日志day6--实习日志day6--title命名规范化&businessType纠正&补充缺失的@Log注解&报警与通信模块补充&产出阶段总结文档
java·开发语言·人工智能·git·python·实习·大二
江华森26 分钟前
Python 实现高德地图找房(一):环境搭建与数据爬虫
开发语言·爬虫·python
杜子不疼.28 分钟前
【Qt初识】信号槽(三):机制意义、断开连接与 Lambda 表达式
开发语言·数据库·qt
陆枫Larry1 小时前
小程序包体积优化:用 SVG 图片替换 iconfont,并保留 CSS 控色能力
前端
Appthing1 小时前
在 TanStack Start 中使用 VitePWA 的正确配置
javascript
老迟到的茉莉2 小时前
Hermes 是谁?跟 Claude Code 差在哪
开发语言·python
学逆向的2 小时前
汇编——内存
开发语言·汇编·算法·网络安全
环境栈笔记2 小时前
多账号浏览器选型检查清单:Profile、权限、Session 和任务日志怎么评估
前端·人工智能·后端·自动化
lbb 小魔仙2 小时前
MuMu 模拟器 6.0 硬核测评:这次升级确实不一样
java·开发语言·模拟器·mumu·硬核测评
前端炒粉2 小时前
手写promise
java·前端·javascript