React生命周期新旧对比

组件从创建到死亡,会经过一些特定的阶段React组件中包含一系列钩子函数{生命周期回调函数},会在特定的时刻调用我们在定义组件的时候,会在特定的声明周期回调函数中,做特定的工作。

旧生命周期总结

旧的生命周期分为三个阶段
1 初始化阶段 由 ReacrDom.render()触发第一次渲染
构造器 即将挂载 渲染 挂载后

constrctor() componentWillMount() render() componentDidMount()

2 更新阶段 由组件内部this.setSate()或父组件重新render()触发

shouldComponentUpdate() componentWillUpdate() render() compinentWillUnmount()

3 卸载 由ReactDom.unmontComponentAtNode()触发

componentWillUnmount()

componentDidMount和componentWillUnmount

下面是个实例展示了透明度的变化
将定时器定义成自身的静态变化 每次挂载后对this.state.time进行操作。

<script type="text/babel">

        class Life extends React.Component {
            //定义透明度
            state = { time: 1 };

            stop = () => {
                //卸载组件
                ReactDOM.unmountComponentAtNode(document.getElementById("test2"))

            }

            //在组建挂载(渲染之后进行)
            //现在属于同级 所以它里面的this指向就是实例
            componentDidMount() {
                //定时器
                this.Inter = setInterval(() => {
                    let { time } = this.state;
                    time -= 0.1;
                    if (time <= 0) {
                        time = 1;
                    }
                    this.setState({ time });
                }, 200);
            }
            //组件被卸载之后执行
            componentWillUnmount() {
                clearInterval(this.Inter);
            }

            render() {
                return (
                    <div>
                        <h2 style={{ opacity: this.state.time }}>声明周期</h2>
                        <button onClick={this.stop}>结束</button>
                    </div>
                )
            }
        }

 ReactDOM.render(<Life />, document.getElementById("test2"))

</script>

旧生命周期挂载渲染过程

旧生命周期的总体流程图如下
在这里插入图片描述
下面分析这条线
在这里插入图片描述

<script type="text/babel">
        class Count extends React.Component{
            constructor(props){
                console.log("count-constructor");
                super(props)
                this.state={count:0}
            }
            componentWillMount(){
                console.log('count-willmount');
            }
            componentDidMount(){
                console.log('count-didmount');
            }
            add=()=>{
                const {count}=this.state
                this.setState({
                    count:count+1
                })
            }
            render(){
                console.log("count-render");
                const {count}=this.state
                return (
                    <div>
                        <h2>当前求和为{count}</h2>
                        <button onClick={this.add}>点我加一</button>
                        </div>
                )
            }
        }
        ReactDOM.render(<Count />, document.getElementById("test2"))

    </script>

可以得出顺序constructor componentWillMount render componentDidMount

旧生命周期更新操作

要返回布尔值 如果真就会更新 不是真就不会更新
在这里插入图片描述

//更新前操作
            shouldComponentUpdate(){
                //控制组件更新
                return true
            }
            //组件将要更新
            componentWillUpdate(){
                
            }
              //组件更新完毕
              componentWillUpdate(){
                
            }

强制更新 forceUpdate
在这里插入图片描述

//组件将要更新
            componentWillUpdate(){
                
            }
              //组件更新完毕
              componentDidUpdate(){
                this.forceUpdate()
            }

子组件收到componentWillReceiveProps

<script type="text/babel">
        class A extends React.Component{
            state={carName:'奔驰'}
            changeCar=()=>{
                this.setState({
                    carName:'奥迪'
                })
            }
            render(){
                return(
                    <div>
                        我是a组件
                    <div>
                        <button onClick={this.changeCar}>点我换车</button>
                        <B carName={this.state.carName}/>
                        </div>    
                    </div>
                )
            }
        }
        class B extends React.Component{
            state={}
            //组件将要接受到新的props
            componentWillReceiveProps(props){
                //将要更新收到的props 第一次不会调用 换成奥迪之后才会
                console.log('B----');
            }
            componentWillUpdate(){
                
            }
              //组件更新完毕
              componentDidUpdate(){
                this.forceUpdate()
            }
            render(){
                return(
                    <div>
                      我是b组件 我接受到的车是{this.props.carName}
                    </div>
                )
            }
        }
        ReactDOM.render(<A />, document.getElementById("test2"))

    </script>

常用的生命周期有有componentWillMount()开启定时器 发送网络请求 发布订阅消息和componentWillUnmount()一般做收尾 取消定时器 取消订阅消息

新的生命周期

含will的三个生命周期 componentWillMount cpomponentWillReceiveProps和componentWillUpdate
即将被废除 引入了getDerivedStateFromPropsgetSnapshotBeforeUpdate

getDerivedStateFromProps

必须返回一个对象或者null

//必须是静态的
//必须有返回值(Null或者state对象)
//如果返回的是state对象,里面的将会对原有的state进行覆盖,
//并且不能修改【因为初始化,更新都会经过这个函数】
//给组件传递的参数,可以作为该方法的参数传递过来。因此可以让该参数作为state。
//也可以以props和state作为参数进行传递
static getDerivedStateFromProps(props) {
  //<A count='199'/>
  console.log("A --- getDerivedStateFromProps", props);
  return null;
}

getSnapshotBeforeUpdate

componentDidupdate 可以接受两个参数如下
在这里插入图片描述

//组件更新之后
componentDidUpdate(preProps,preState) {
  console.log(preProps,preState);
  console.log("A --- componentDidUpdate");
}

下周主要计划

下周主要计划是学习一下直播推拉流 并写页面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/483238.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nacos部署(三)Docker部署Nacos2.3单机环境

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Nacos部署&#xff08;三&#xff09;Docker部署Nacos2.3单机环境 ⏱️…

SQLiteC/C++接口详细介绍sqlite3_stmt类(六)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;五&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;七&#xff09; 17. sqlite3_clear_bindings函数 sqlite3_clear_bindings函…

从零开始学习在VUE3中使用canvas(五):globalCompositeOperation(图形混合)

一、简介 通过设置混合模式来改变图像重叠区域的显示方式。 const ctx canvas.getContext("2d");ctx.globalCompositeOperation "source-over"; 二、属性介绍 source-over 这是默认的复合操作。将源图像绘制到目标图像上&#xff0c;保留目标图像的不透…

通过jsDelivr实现Github的图床CDN加速

最近小伙伴们是否发现访问我的个人博客http://xiejava.ishareread.com/图片显示特别快了&#xff1f; 我的博客的图片是放在github上的&#xff0c;众所周知的原因&#xff0c;github访问不是很快&#xff0c;尤其是hexo博客用github做图床经常图片刷不出来。一直想换图床&…

牛客NC108 最大正方形【中等 动态规划 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/0058c4092cec44c2975e38223f10470e 思路 动态规划: 先初始化第一行和第一列。然后其他单元格依赖自己的上边&#xff0c;左边和左上角参考答案Java import java.util.*;public class Solution {/*** 代码中的类…

【Docker】golang操作容器使用rename动态更新容器的名字

【Docker】golang操作容器使用rename动态更新容器的名字 大家好 我是寸铁&#x1f44a; 总结了一篇golang操作容器使用rename动态更新容器的名字✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天遇到一个新的需求&#xff0c;要动态改变运行中的容器名字。 可以考虑先把…

OpenLayers基础教程——WebGLPoints中要素样式的设置方法解析

1、前言 前一篇博客介绍了如何在OpenLayers中使用WebGLPoints加载海量数据点的方法&#xff0c;这篇博客就来介绍一下WebGLPoints图层的样式设置问题。 2、样式运算符 在VectorLayer图层中&#xff0c;我们只需要创建一个ol.style.Style对象即可&#xff0c;WebGLPoints则不…

静态综合实验

一.搭建拓扑结构 1.根据拓扑结构可以把网段分成14个网段&#xff0c;根据192.168.1.0/24可以划分出ip地址和环回地址 其中环回r1分别是 192.168.1.32/27 192.168.1.32/28 192.168.1.48/28 2.划分完后如图&#xff1a; 二.配置IP地址 注意&#xff1a;为了避免错误&#…

业务服务:xss攻击

文章目录 前言一、使用注解预防1. 添加依赖2. 自定义注解3. 自定义校验逻辑4. 使用 二、使用过滤器1. 添加配置2. 创建配置类3. 创建过滤器4. 创建过滤器类5. 使用 前言 xss攻击时安全领域中非常常见的一种方法&#xff0c;保证我们的系统安全是非常重要的 xss攻击简单来说就…

JavaSE:实现象棋游戏

文章目录 1. 每日一言2. 游戏内容介绍3. 代码介绍4. 全部代码4.1 MainFream4.2 GamePanel4.3 ChessFactory4.4 Bing4.5 Boss4.6 Che4.7 Chess4.8 Ma4.9 Pao4.10 Shi4.11 Xiang 结语 1. 每日一言 Every cloud has a silver lining. 天无绝人之路。 2. 游戏内容介绍 象棋是一种…

‘str‘ object has no attribute ‘decode‘

跑别人代码的时候遇到一个问题 print(f"{gpu_device_name.decode(utf-8)} is allocated sucessfully at location: {gpu_device_location}")结果就报错了 解决问题如下 aa "adfd"aa.decode(utf-8)结果如下 aa "adfd" aa.encode().decode(ut…

初识进程的地址空间、页表

一、&#x1f31f;问题引入 &#x1f6a9;代码一&#xff1a; #include<stdio.h>#include<unistd.h>int g_val100;int main(){pid_t idfork();if(id0){//子进程while(1){printf("I am a child pid:%d ppid:%d g_val:%d\n",getpid(),getppid(),g_val);…

# Maven Bom 的使用

Maven Bom 的使用 文章目录 Maven Bom 的使用概述BOM特点优点缺点 MavenMaven 安装安装步骤settingx.ml常用仓库地址Idea 使用maven常见坑 SpringBoot 项目Bom使用案例项目结构主项目 zerocode-back-servezc-dependency&#xff08;第三方jar管理&#xff09;子模块zc-serve子模…

【保姆级教程】YOLOv8目标检测:训练自己的数据集

一、YOLOV8环境准备 1.1 下载安装最新的YOLOv8代码 仓库地址&#xff1a; https://github.com/ultralytics/ultralytics1.2 配置环境 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple二、数据准备 2.1 安装labelme标注软件 pip install label…

2024阿里云2核2G服务器租用价格99元和61元一年

阿里云2核2G服务器配置优惠价格61元一年和99元一年&#xff0c;61元是轻量应用服务器2核2G3M带宽、50G高效云盘&#xff1b;99元服务器是ECS云服务器经济型e实例ecs.e-c1m1.large&#xff0c;2核2G、3M固定带宽、40G ESSD entry系统盘&#xff0c;阿里云活动链接 aliyunfuwuqi.…

[STM32] Keil MDK 新建工程编译不通过(warning: #2803-D和Error: L6218E)解决方法备忘

按照野火的PDF教程的第4章&#xff1a;[野火]《RT-Thread 内核实现与应用开发实战—基于STM32》.pdf 新建 Keil MDK 工程&#xff0c;工程设置完成后点击编译按钮&#xff0c;编译不通过&#xff1a; RTE\Device\ARMCM3\startup_ARMCM3.c(75): warning: #2803-D: unrecognize…

JVM快速入门(1)JVM体系结构、运行时数据区、类加载器、线程共享和独享、分区、Java对象实例化

5.1 JVM体系结构 线程独占区-程序计数器&#xff08;Program Counter Register&#xff09; 程序计数器是一块较小的内存空间&#xff0c;它可以看做是当前线程所执行的字节码的行号指示器&#xff1b;在虚拟机的概念模型里&#xff0c;字节码解释器工作时就是通过改变这个计数…

C++:练习题

一、构造、析构顺序 C c; int main() {A a;B b;static D d;return 0; } //构造顺序&#xff1a;C A B D //析构顺序&#xff1a;~B ~A ~D ~C 二、拷贝构造次数 以下代码共调用多少次拷贝构造&#xff1f; Widget f(Widget u) //第一次&#xff1a;传值拷贝构造 {Widget v(u…

【QT+QGIS跨平台编译】之九十:【QGIS_Crashhandler+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、QGIS_Crashhandler介绍二、QGIS下载三、文件分析四、pro文件五、编译实践一、QGIS_Crashhandler介绍 QGIS_Crashhandler模块是QGIS中的一个重要组成部分,它提供了QGIS程序的错误崩溃处理与跟踪。 二、QGIS下载 QGIS网址: QGIS Source Download 获取最新版本的…

【Linux系统编程(进程编程)】进程的退出:父进程等待子进程的退出之僵尸进程与孤儿进程

文章目录 一、进程退出1.1、进程正常退出方式1.2、异常退出 二、父进程等待子进程退出&#xff08;一&#xff09;2.1、为什么要等待子进程退出2.2、&#xff08;1&#xff09;父进程等待子进程退出并收集子进程的退出状态如何等待wstatus空wstatus非空 2.3、&#xff08;2&…