【React】 12课 react的生命周期函数执行顺序详解

2023-11-16

1. Mounting 初始化阶段(挂载阶段)执行的函数:

①构造函数(里面存放this.state组件数据)

constructor (props){ //props是父组件传过来的参数
super(props);
this.state = {}
}

②组件即将被挂载

UNSAFE_componentWillMount(){}

③更新渲染

render(){}

④组件已经渲染完成了

componentDidMount{}

2. Updating (组件运行阶段)执行的函数:

nextProps // 获取父组件更新的时候带来的数据
nextState //获取组件本身的数据

①父组件传递的Props发生变化 会触发生组件的这个函数

UNSAFE_componentWillReceiveProps(nextProps) {}

②组件是否需要更新数据 若shouldComponentUpdate函数return false, 则下面的函数不会执行

shouldComponentUpdate(nextProps, nextState) {}

③组件即将更新的过程

UNSAFE_componentWillUpdate(nextProps, nextState){}

④组件渲染组件页面

render(){}

⑤组件已经更新完成

componentDidUpdate(){}

3. Mounting (组件销毁阶段)执行的函数:

componentWillUnmount(){}

接下来我们通过实例证明一下:

首先我们如1课创建一个文件夹在文件夹中安装react环境需要的配置文件

npm init -y
npm i babel-standalone -D
npm i react react-dom -D

安装配置文件教程链接:https://blog.csdn.net/qq_41614928/article/details/93771657
安装完成后我们开始编写下面代码

(1) 组件Mounting 初始化阶段(挂载阶段)代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>生命周期</title>
</head>

<body>
  <!-- 所有的页面代码都是放在这里面 -->
  <div id="app"></div>
  <!-- 用于解析jsx的代码 babel引用应在前面 -->
  <script src="./node_modules/babel-standalone/babel.js"></script>
  <!-- 引用react模块,用于构建用户界面的 JavaScript 库 UI库 -->
  <script src="./node_modules/react/umd/react.development.js"></script>
  <!-- 操作VM DOM 加载顺序必须先引入react再引入react-dom-->
  <script src='./node_modules/react-dom/umd/react-dom.development.js'></script>

  <!-- 引入script类型为babel样式 这样可以解析里面的jsx代码 -->
  <script type='text/babel'>
    class App extends React.Component{
      constructor(props){
        super(props);
        this.state = {
            a:this.props.title,
            b:props.title
        }
        console.log( '01-构造函数' )
      }
      componentWillMount(){
        console.log( '02-组件即将被挂载' )
        this.setState({
            c:'请求到的数据'
        })
        console.log( '02-组件即将被挂载 this.state.c='+ this.state.c ) //undefined
        console.log( '02-组件即将被挂载 this.refs=空'+ this.refs )  //{}
        setTimeout(() => {
            console.log( '02-组件即将被挂载内的异步函数 this.state.c='+this.state.c )
        }, 2000);
      }
      //点击按钮
      handleClick=()=>{
        this.setState({
            b:'已经触发点击事件,B的值发生变化'
        })
      }
      //组件页面渲染
      render(){
        console.log( '03-组件在页面上被渲染' )
        return (
          <div>
            <h2 ref={'h2'}> 我是子组件里面的值 </h2>   
            { this.state.a}
            <br/>
            { this.state.b}
            <br/>
            { this.state.c}
            <button ref={'btn'} onClick={this.handleClick} > 点击按钮 </button>
          </div>
        )
      }
        //如果在即将渲染数据前请求数据,有时候会出现白屏,页面当中文字也加载出现问题;
        //最佳请求数据是在componentDidMount去请求;
        componentDidMount(){
          console.log( '04-已经渲染完成了' )
          console.log( '04-已经渲染完成了 this.refs=' + this.refs )  //{h2: h2, btn: button}
        }
    }

    ReactDOM.render(
      <App title={'这个是父组件里面值'}></App>,
      document.getElementById('app')
    )
  </script>
</body>
</html>

运行结果如下:

在这里插入图片描述

当点击 点击事件 3下后:

在这里插入图片描述

(2)组件 Updating (组件运行阶段)与 Mounting (组件销毁阶段) 代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>生命周期</title>
    <style>
    .list{ border: 1px solid #ccc}
    </style>
</head>
<body>
  <!-- 所有的页面代码都是放在这里面 -->
  <div id="app"></div>
  <!-- 用于解析jsx的代码 babel引用应在前面 -->
  <script src="./node_modules/babel-standalone/babel.js"></script>
  <!-- 引用react模块,用于构建用户界面的 JavaScript 库 UI库 -->
  <script src="./node_modules/react/umd/react.development.js"></script>
  <!-- 操作VM DOM 加载顺序必须先引入react再引入react-dom-->
  <script src='./node_modules/react-dom/umd/react-dom.development.js'></script>

  <!-- 引入script类型为babel样式 这样可以解析里面的jsx代码 -->
  <script type='text/babel'>
    //子组件list
    class List extends React.Component{
        constructor(props){
            super(props);
            this.state = {
                list:'这里是list传入的值',
                candy:this.props.title
            }
            console.log( '01-构造函数constructor' )
        }
        componentWillReceiveProps(nextProps) {
            console.log( '02-父组件传递的Props发生变化 会触发生组件的这个函数componentWillReceiveProps' )
            console.log( nextProps )
        }
        shouldComponentUpdate(nextProps, nextState) {
            console.log( '03-组件是否需要更新数据shouldComponentUpdate' )
            console.log( nextProps, nextState )
            //返回 false 组件不更新 / 返回 true 则更新执行下面04 05 06
            return true
        }
        componentWillUpdate(nextProps, nextState){
            console.log( '04-组件即将更新的过程componentWillUpdate' )
            console.log( nextProps, nextState )
        }
        render(){
            console.log( '05-组件渲染过程render' )
            return (
                <div>
                    <div className="list">
                      <h3> 这个是List组件样式 </h3>    
                      <br />
                      <b> {this.state.list} </b>
                      <br/>
                      <i>{this.state.candy}</i>
                      <br/>
                      <em>{this.state.p}</em>
                    </div>
                </div>
            )
        }
        componentDidUpdate(nextProps, nextState){
            console.log( '06-组件已经更新完成componentDidUpdate' )
            console.log( nextProps, nextState )
        }
        //组件销毁时触发的函数
        componentWillUnmount(){
            console.log( '07-组件已经销毁了!componentWillUnmount' )
            // window.localStorage.setItem() 里面可以保存数据
        }
    }

    //父组件App
    class App extends React.Component{
      constructor(props){
        super(props);
        this.state = {
            p:'这个是父组件当中的状态里的p值',
            onOff:true
        }
      }
      //点击按钮
      handleClick =()=> {
        this.setState({
            p:'点击的时候改变app里面的值;'
        })
      }
      //创建/销毁 组件按钮
      destroy=()=>{
        let onOff = !this.state.onOff;
        this.setState({
          onOff:onOff
        })
      }
      render(){
        return (
          <div>
            <h2> 我是子组件里面的值 </h2> 
            { //this.state.p是传递给子组件的值 若改变p 子组件会触发componentWillReceiveProps函数
              this.state.onOff && (<List title={this.state.p}></List>)
            }
            <button onClick={ this.handleClick }>点击按钮 </button>
            <input type='button' value={this.state.onOff? '销毁组件':'创建组件'} onClick={ this.destroy }/>
          </div>
        )
      }
    }

    ReactDOM.render(
      <App></App>,
      document.getElementById('app')
    )

  </script>
</body>
</html>

运行结果如下:

在这里插入图片描述

当我们通过点击事件改变父组件< App>传递给子组件< List>的p值时 运行结果如下:

在这里插入图片描述

当我们通过点击事件 销毁< List>组件时:

在这里插入图片描述

当我们再次通过点击事件 创建< List>组件时:组件< List>初始化并挂载

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【React】 12课 react的生命周期函数执行顺序详解 的相关文章

随机推荐

  • adb shell 小米手机_小米手机ADB删除系统应用去广告。

    小米手机ADB删除系统应用去广告 前言 1 准备 2 进入开发者模式 3 连接手机与电脑 4 使用ADB命令删除系统应用 本文要介绍的方法可以免 root 卸载预置应用 仅删除当前用户下的 APP 不是彻底删除 APP 恢复出厂设置后 删除
  • mysql 子查询(七)之子查询排序

    大多数子查询不需要排序 没有意义 因为子查询大多数是作为一个结果或参数给主查询使用 但top n问题除外 举个例子 查询员工表中 行政部 的员工 select from emp where empdetno select empdetno
  • 一种为polar code简化的sc译码

  • 业绩归因 绩效评估 - 各种收益率计算方法

    收益率计算 1 定义 1 1 日收益率 收 益 率 收 益 额
  • echarts默认显示一个时间点的tooltip以及鼠标移出之后依然显示 tooltip

    最终显示效果如下 默认打开页面显示设置的某个时间点的tooltip 鼠标移开之后依然显示 下面是实现代码 一看就懂 搬走就用 draw tabIndex let pricetrend this echarts getInstanceByDo
  • 280个ai网站导航vs500+ai工具集导航,到底哪一个好?

    最值得收藏的AI工具 让你生产力爆表 效率无敌 简洁猫AI网站导航 包含了 包含但不限于 ChatGPT Midjourney 阿里云AI学习路线 金山快译 酷表ChatExcel 通义千问 通义万相 达摩院 讯飞 触手AI 腾讯智影 腾讯
  • Mysql的架构

    目录 一 什么是数据库 DataBase 二 MySQL架构 Server层 存储引擎层 1 一条SQL语句的执行过程 server层 2 一条记录是怎么存储的 存储引擎层 三 深入存储引擎层理解 1 内存池 缓冲池 Buffer Pool
  • CMD命令关闭指定PID进程

    CMD命令关闭指定PID进程 在开发过程中 有时会遇到端口被不知名进程占用掉 这时 可以选择使用微软自带的任务管理器关闭被占用的进程 当然也可以使用命令快速定位被占用端口的PID 并把这个PID进程kill掉 查询54530端口被进程占用的
  • 如何侦听网线数据_网线选择完全指南,网线会影响网速吗?(附5、6、7类网线知识科普)...

    对于家用路由器如何选择 这三篇文章其实写的很详细了 普通家用路由器选择 2020 家用路由器选购完全指南 附小白向知识扫盲 WiFi6 路由器选择 要不要买 WiFi6 的路由器 附WiFi6 技术要点 大户型路由器选择 2020 适合大户
  • Servlet的生命周期~

    前两天面试被问到关于Servlet生命周期的问题 现在好好地将这个问题理一下 首先如下图所示 Servlet运行在Servlet容器中 其生命周期由容器来管理 Servlet的生命周期通过javax servlet Servlet接口中的i
  • OpenWRT基本知识整理

    转载自 http www liwangmeng com openwrt E5 9F BA E6 9C AC E7 9F A5 E8 AF 86 E5 BD 92 E7 BA B3 目录 1 OpenWRT虚拟系统准备 3 1 1 编译ope
  • 控件关联变量

    控件是对话框的重要组成部分 控件的访问可以通过关联变量实现 包括关联数据变量和控制变量 DDX Text 将控件与成员变量关联 放在DoDataExchange中 管理对话框 表格视或控件视对象中的编辑控件与对话框 表格视或控件视对象的CS
  • 【Mybatis.xml】mybatis的配置

  • 最新在线IDE流行度最新排名(每月更新)

    2023年09月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多 人们就会认为它越受欢迎 原始数据来自谷歌Trends 如果您相信集体智慧 那么TOP ODE索
  • Go语言的运行机制&程序是怎么跑起来的

    学习Golang有一段时间了 自己看着各种教程也码了些demo 其实接触了这么多语言 当因为工作 项目 兴趣所驱在短时间切换一门编程语言时 并不会太难上手 甚至会对了解一些很雷同的基础语法感到枯燥 但这是必经之路 对于一个技术爱好者而言 技
  • 内网隧道代理技术(二十一)之 CS工具自带中转技术上线不出网机器

    CS工具自带上线不出网机器 如图A区域存在一台中转机器 这台机器可以出网 这种是最常见的情况 我们在渗透测试的过程中经常是拿下一台边缘机器 其有多块网卡 边缘机器可以访问内网机器 内网机器都不出网 这种情况下拿这个边缘机器做中转 就可以使用
  • 模拟退火算法补充

    原博客 模拟退火算法详解 误区及matlab实现 是好人的墨叔的博客 CSDN博客 模拟退火算法不收敛 补充初始温度和终止温度的选择 选择不当会导致优化效果不佳 1 初始温度的选择 最小优化的话 根据exp f T 和运行10次左右的 f选
  • vue3 触底加载数据(滚动加载分页数据)

    html div class integral record cont div class integral record item div class traditional integral panel div class tradit
  • JDBC连接postgresql

    1 在pom xml中导入包
  • 【React】 12课 react的生命周期函数执行顺序详解

    1 Mounting 初始化阶段 挂载阶段 执行的函数 构造函数 里面存放this state组件数据 constructor props props是父组件传过来的参数 super props this state 组件即将被挂载 UNS