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

React类组件生命周期详解

在React的类组件中,从组件创建到组件被挂载到页面中,这个过程react存在一系列的生命周期函数,最主要的生命周期函数是componentDidMount、componentDidUpdate、componentWillUnmount

生命周期图例如下

1. componentDidMount组件挂载

如果你定义了 componentDidMount 方法,React 将会在组件被添加到屏幕上 (挂载) 后调用它。这里是设置数据获取、订阅监听事件或操作 DOM 节点的常见位置。

  • 参数:componentDidMount 不需要任何参数;
  • 返回值:componentDidMount 不应该返回任何值;
  • 场景:多用于组件中进行网络请求,DOM操作等;
  componentDidMount() {console.log("component did mount");}

2. componentDidUpdate组件更新

如果你定义了 componentDidUpdate 方法,那么 React 会在你的组件更新了 props 或 state 重新渲染后立即调用它。这个方法不会在首次渲染时调用

  • 参数:
    • prevProps:更新之前的 props。prevProps 将会与 this.props 进行比较来确定发生了什么改变;

    • prevState:更新之前的 state。prevState 将会与 this.state 进行比较来确定发生了什么改变;

    • snapshot: 如果你实现了 getSnapshotBeforeUpdate 方法,那么 snapshot 将包含从该方法返回的值。否则它将是 undefined

  • 返回值:componentDidMount 不应该返回任何值;

  • 注意:如果在组件中定义了shouldComponentUpdate 并且返回值是 false 的话,componentDidUpdate 将不会被调用。如果在componentDidUpdate 中直接调用 setState方法,会造成触发一次发生在浏览器更新屏幕内容之前的额外渲染,在这种情况下,即使 render 会被调用两次,用户也看不到中间状态。这种模式通常会导致性能问题。

  componentDidUpdate(prevProps, prevState, snapshot) {console.log("component did update");}

3. componentWillUnmount组件卸载

如果你定义了 componentWillUnmount 方法,React 会在你的组件被移除屏幕(卸载)之前调用它。此方法常常用于取消数据获取或移除监听事件。

  • 参数:componentDidMount 不需要任何参数;
  • 返回值:componentDidMount 不应该返回任何值;
  • 注意:componentWillUnmount 内部的逻辑应该完全“对应”到 componentDidMount 内部的逻辑,例如,如果你在 componentDidMount 中设置了一个监听事件,那么 componentWillUnmount 中就应该清除掉这个监听事件,例如定时器任务等。
  componentWillUnmount() {console.log("component willUnmount");}

4. getSnapshotBeforeUpdate组件快照

getSnapshotBeforeUpdateReact 会在 React 更新 DOM 之前时直接调用它。它使你的组件能够在 DOM 发生更改之前捕获一些信息(例如滚动的位置)。此生命周期方法返回的任何值都将作为参数传递给 componentDidUpdate。

  • 参数:
    • prevProps:更新之前的 Props。prevProps 将会与 this.props 进行比较来确定发生了什么改变。

    • prevState:更新之前的 State。prevState 将会与 this.state 进行比较来确定发生了什么改变。

  • 返回值:返回你想要的任何类型的快照值,或者是 null你返回的值将作为第三个参数传递给 componentDidUpdate

  getSnapshotBeforeUpdate(prevProps, prevState) {console.log("getSnapshotBeforeUpdate");return "123"}

运行结果:

用例组件App:

class HelloWorld extends React.Component {constructor() {super()this.state = {banners: ['新歌曲','新mv', '新歌单'],porductsList: ['商品','热门', '流行'],count: 100,}}changeCount(count) {this.setState({count: this.state.count + count})}render() {const { banners, porductsList, count} = this.statereturn (<div><Header /><Main banners={banners} addClick={(count) => this.changeCount(count)} /><Footer porductsList={porductsList}/><div>{count}</div></div>)}componentDidMount() {console.log("component did mount");}getSnapshotBeforeUpdate(prevProps, prevState) {console.log("getSnapshotBeforeUpdate");return "123"}componentDidUpdate(prevProps, prevState, snapshot) {console.log("component did update");console.log("prevProps, prevState, snapshot", prevProps, prevState, snapshot); // snapshot 就是 getSnapshotBeforeUpdate 返回的值 123}componentWillUnmount() {console.log("component willUnmount");}
}

http://www.lryc.cn/news/351550.html

相关文章:

  • 智能车竞赛指南:从零到一,驶向自动驾驶的未来
  • 微服务项目收获和总结---第2,3天(分库分表思想,文章业务)
  • 【全网最全】2024电工杯数学建模A题21页初步参考论文+py代码+保奖思路等(后续会更新)
  • 怎么通过OpenAI API调用其多模态大模型(GPT-4o)
  • 自定义文字线性
  • robosuite导入自定义机器人
  • 四天学会JS高阶(学好vue的关键)——构造函数数据常用函数(理论+实战)(第二天)
  • 【Linux学习】进程地址空间与写时拷贝
  • Git远程控制
  • 怎样从SQL中分析和提取访问的字段信息?| OceanBase实践
  • MySQL 服务无法启动
  • Python贪心算法
  • 牛客网刷题 | BC85 牛牛学数列3
  • quartz定时任务
  • Python基础学习笔记(五)——选择结构与循环结构
  • Vue插槽solt如何传递具名插槽的数据给子组件?
  • 小程序-收货地址管理模块实现
  • 【星海随笔】微信小程序(三)
  • pip(包管理器) for Python
  • Ubuntu上安装Maven
  • java中使用svnkit实现文件的版本管理
  • 了解 Linux 网络卡绑定:提高网络性能与冗余性
  • 2024年618购物狂欢节即将来袭!精选五款超值入手数码好物!
  • 中国AI独角兽资本大冒险
  • 项目十二:简单的python基础爬虫训练
  • OpenGL学习入门及开发环境搭建
  • three.js能实现啥效果?看过来,这里都是它的菜(08)
  • SpringBoot(九)之整合mybatis
  • 【实战教程】使用Spring AOP和自定义注解监控接口调用
  • 算法学习之:Raft-分布式一致性/共识算法