React的生命周期 和 页面优化

2023-11-08

React的生命周期 和 页面优化

先上React的生命周期图
React生命周期图
页面优化问题在 shouldComponentUpdate 函数那里写的(有颜色备注)

React声明周期的四个大阶段:

  • Initialization:初始化阶段。
  • Mounting: 挂在阶段。
  • Updation: 更新阶段。
  • Unmounting: 销毁阶段。

什么是生命周期函数

用大神 技术胖 来说就是

生命周期函数指在某一个时刻组件会自动调用执行的函数

阶段说明

Initialization指的是初始化过程,这个时候组件会初始化自己的一些数据,比如props,比如state,constructor就是我们初始化的位置,在这里会定义state,会接收props。 代码就不上了,大家有兴趣可以看看官网文档 ,也就不过多解释了

  • 1 Mounting 挂载阶段

    Mounting阶段叫挂载阶段,伴随着整个虚拟DOM的生成,它里边有三个小的生命周期函数,分别是:

     componentWillMount : 在组件即将被挂载到页面的时刻执行。
     render             : 页面state或props发生变化时执行。
     componentDidMount  : 组件挂载完成时被执行。
    

执行代码:

//componentWillMount代码
	componentWillMount(){
	    console.log('我是componentWillMount--组件将要挂载到页面的时刻出现')
	}
//componentDidMount代码
	componentDidMount(){
	    console.log('我是componentDidMount--组件挂载完成的时刻执行出现')
	}
//render代码  (必写)
	render(){
	    console.log('我是render-组件挂载中出现')
	}

打印出来的顺序是

 - componentWillMount
 - render
 - componentDidMount

注意的问题

componentWillMount和componentDidMount这两个生命周期函数,只在页面刷新时执行一次,而render函数是只要有state和props变化就会执行。

  • 2 Updation 更新阶段
    Updation也就是组件发生改变的更新阶段,这是React生命周期中比较复杂的一部分,它有两个基本部分组成,一个是props属性改变,一个是state状态改变(这个在生命周期的图片中可以清楚的看到,props比state 只多了一个componentWillReceiveProps 函数)。

    执行代码:

//	componentWillReceiveProps 函数
//  **注意** 这个是写在子组件中的 // 因为顶层组件,它并没接收任何的props
	componentWillReceiveProps(){
		//凡是组件都有生命周期函数,所以子组件也是有的,并且子组件接收了props,这时候函数就可以被执行了。
        console.log('child - componentWillReceiveProps')
    }

子组件接收到父组件传递过来的参数,父组件render函数重新被执行,这个生命周期就会被执行。

  • 也就是说这个组件第一次存在于Dom中,函数是不会被执行的;
  • 如果已经存在于Dom中,函数才会被执行。
//shouldComponentUpdate函数代码
//它要求返回一个布尔类型的结果,必须有返回值,这里就直接返回一个true
	shouldComponentUpdate(){
	    console.log('shouldComponentUpdate---组件发生改变前执行')
	    return true
	}

这里写一下shouldComponentUpdate的重要性 也是页面标题写的 页面优化问题

  • shouldComponentUpdate函数会在组件更新之前,自动被执行。
  • 它要求返回一个布尔类型的结果,必须有返回值,truefalse
  • 简单点说,就是返回true,就同意组件更新;返回false,就反对组件更新。

页面优化问题

在子组件频繁无用渲染render,这样项目小的话 看上去没有问题性能损耗很小,但是当你页面很复杂时,足以影响用户体验,积少成多嘛,性能损耗会增加 页面会卡顿,肯定会被组长或总监骂死的;
这里用shouldComponentUpdate 就能解决了

首先你要确认你安装了谷歌 React Developer Tools 插件,如果你没有安装,可以到百度一下安装。有了这个浏览器插件,就可以在控制台中找到React标签,然后在右边点开设置,选中highlight Updates。
这时候你在浏览器的文本框中输入一下内容,你可以清楚的看到子组件也发生了重新render的情况。

代码如下:

	shouldComponentUpdate(){
	    return false;
	}

这时候在浏览器中查看,问题已经没有了。但是这样做太暴力了,否定了所有的东西,那如果在真实项目中,需要改变值属性值,达到渲染就没办法了

shouldComponentUpdate有两个参数(相当有用):

 1. nextProps:变化后的属性;
 2. nextState:变化后的状态;
//示例
	shouldComponentUpdate(nextProps,nextState){
		//content 父传过来的数据 可以按自己项目需求写
	    if(nextProps.content !== this.props.content){ 
	        return true
	    }else{
	        return false
	    }
	}

这样就解决了子组件的渲染性能问题

我们接着说 Updation 后面的俩个函数 componentWillUpdatecomponentDidUpdate

componentWillUpdate在组件更新之前,但shouldComponenUpdate之后被执行。但是如果shouldComponentUpdate返回false,这个函数就不会被执行了。

//componentWillUpdate函数 代码
	//shouldComponentUpdate返回true才会被执行。
	componentWillUpdate(){
	    console.log('componentWillUpdate---组件更新前,shouldComponentUpdate函数之后执行')
	}

//componentDidUpdate函数 代码
//componentDidUpdate在组件更新之后执行,它是组件更新的最后一个环节。
	componentDidUpdate(){
	    console.log('componentDidUpdate----组件更新之后执行')
	}

打印出来的顺序是

 - 1、shouldComponentUpdate
 - 2、componentWillUpdate
 - 3、render
 - 4、componentDidUpdate
  • 3 Unmounting 销毁阶段
    把最后一个React的生命周期函数讲一下,这个生命周期周期函数就是componentWillUnmount,它是在组件去除时执行。

这个函数时组件从页面中删除的时候执行 (子组件)

//当组件从页面中删除的时候执行
	componentWillUnmount(){
	    console.log('child - componentWillUnmount')
	}








这里好多都是听大神 技术胖讲的 自己整理的 ,有兴趣的朋友去看看

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

React的生命周期 和 页面优化 的相关文章

  • 【Ubuntu】手把手教你打造 【VS Code + Cmake + C/C++】 开发环境

    下载安装VSCODE CMAKE Cmake安装请看我的这篇帖子 https blog csdn net TU Dresden article details 122373789 spm 1001 2014 3001 5501 VScode
  • shell基础知识

    shell基础知识 脚本语言 脚本是短小的 用来让计算机完成一系列工作的程序 这类程序可以用文本编辑器修改 不需要编译 通常是解释运行的 是一个约定的标记 告诉系统其后路径所指定的程序即是解释此脚本文件的shell程序 shell变量 使用
  • maven集成单元测试插件

    1 maven不可允许忽略单元测试 2 引用jacoco version

随机推荐

  • 【Unity】 DoTween对UI进行DoFade操作存在问题及解决办法

    Unity DoTween对UI进行DoFade操作存在问题 Unity版本 5 2 5 4 当使用this GetComponent
  • 很好用的etcd可视化管理工具 etcdv3-browser

    etcd是一个高可用 强一致性的服务发现存储仓库的 是k8s里的一个基础组件 现在随着k8s的不断的被企业所使用 etcd也越来越被看好作为服务发现的好的组件之一 今天推荐的是一款用来对etcd进行管理的图形化管理工具 etcdv3 bro
  • (04)VTK移动模型,判断是否相交

    前言 在模型相交检测时 碰撞检测 使用了重写vtkInteractorStyleTrackballActor函数的自己构建的交互器 实现检测鼠标按键 并显示不同颜色在不同相交情况时 方法 重写 vtkInteractorStyleTrack
  • fastboot通用线刷工具_[教程] 小米手机解BL锁、线刷详细教程,适用于小米全系列手机...

    这几天看到论坛里很多人在问怎么线刷 下面我就做个详细的线教程大家看一下高手别喷我哈 此教程只适合刷官方MIUI包 进入正题 第一步 解BL锁 1 浏览器打开http www miui com unlock done html点击立即解锁 然
  • QT多线程

    本文档是自己所整理的一份文档 部分是原创 还转贴了网上的一此资料 已经标明了 难点是多线程的编写 是有源代码的 大家可以作为参考 用到的知识是视频采集 压缩解压 xvid 实时传输 jrtp 基于qt库所写的 由于本人对qt下的多线程还不很
  • Ubuntu20.04安装RabbitMQ,并配置远程调用,详细教程

    一 简介 RabbitMQ是一种在Erlang OTP中实现的开源消息队列软件 它实现了AMQP 高级消息队列协议 并使用插件与流行的消息传递解决方案进行通信 如MQTT 消息队列遥测传输 面向文本流的消息传递协议等 在本文中 您将了解如何
  • Linux中Shell脚本命令替换和grep接收变量作为参数

    需求 再服务器上启动Springboot项目上 使用Shell脚本作为启动脚本去执行 然后调用jar包 在本项目 需要从配置文件application properties中去获取端口号 然后根据端口号去获取进程的PID 问题 第一 如果获
  • 机器学习面试150题:不只是考SVM xgboost 特征工程(101-153)附送【名企AI面试100题】

    101 你意识到你的模型受到低偏差和高方差问题的困扰 应该使用哪种算法来解决问题呢 为什么 低偏差意味着模型的预测值接近实际值 换句话说 该模型有足够的灵活性 以模仿训练数据的分布 貌似很好 但是别忘了 一个灵活的模型没有泛化能力 这意味着
  • 服务器防御DDoS的方法,一文解决DDoS攻击

    近来 DDoS攻击越来越严重 香奈儿韩国分公司在黑客入侵其数据库后发表了道歉声明 表示公司已封锁黑客攻击背后的IP地址 并聘请一家网络安全公司调查此事 广大的网站用户应该采取怎样的措施进行有效的防御呢 下面超级科技就介绍一下防御DDoS攻击
  • 2023前端面试题(第一版持续更新)

    CSS display none 和visibility hidden 的区别是什么 display none 隐藏对应的元素 在文档布局中不再给它分配空间 它各边的元素会合拢 就当他从来不存在 visibility hidden 隐藏对应
  • Unity SpriteAtlas(图集)自动生成工具

    Unity SpriteAtlas 图集 自动生成工具 什么是图集 图集是一种将多个纹理合并为一个组合纹理的资源 可以调用此单个纹理来发出单个绘制调用而不是发出多个绘制调用 能够以较小的性能开销一次性访问压缩的纹理 为什么要打图集 减少Dr
  • Activiti工作流使用

    Activiti工作流 熟悉能用即可 https github com Activiti Activiti
  • java 企业工程管理系统软件源码 自主研发 工程行业适用

    工程项目管理软件 工程项目管理系统 对建设工程项目管理组织建设 项目策划决策 规划设计 施工建设到竣工交付 总结评估 运维运营 全过程 全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一 系统管理 1 数据字典 实现对数据字典标签
  • Ubuntu PCL安装过程之中遇见到问题

    详细的PCL安装过程在之前的文章之中有过记录 但是我一直忽略了一个问题 导致安装过程之中一直出现问题 在编译PCL 源码的过程如下 cd pcl mkdir build cd build cmake D CMAKE BUILD TYPE N
  • 【C++学习笔记(二十一)】之基类,子类的类型转换

    本文章由公号 开发小鸽 发布 欢迎关注 老规矩 妹妹镇楼 一 普通基类 子类的转换 子类是由继承于基类 通常子类的内容要比基类多一些 因此子类开辟的内存要比基类大一些 一 基类 gt 子类 向下类型转换 当我们要把基类强转为子类时 由于子类
  • 帕斯卡三角形

    题目链接 int generate int numRows int returnSize int returnColumnSizes int ans malloc sizeof int numRows 开辟一块内存空间 用来返回ans 大小
  • ShapeDTW代码运行问题记录与解决方法

    下载shapeDTW的GitHub代码运行 测试 源码是MATLAB写的 需要保证电脑安装MATLAB 然后根据readme txt文件提示 第一步下载UCR数据集 http www cs ucr edu eamonn time serie
  • 实现哈夫曼树和哈夫曼编码

    原谅小编做了只鸽子 鸽了这么久 哈夫曼树在日常生活中可以用于文件的压缩 所以是我们程序员必不可少的基本功 下面跟着小编我一起来实现哈夫曼树和编码吧 一 哈夫曼树的实现 一 实现原理 哈夫曼树是一种特殊的二叉树 我们先假设有一个森林 里面是一
  • 捡硬币问题 动态规划算法C语言实现

    问题描述 现有n个硬币按顺序依次排列在你面前 它们的面值可以看作一个数组coins 5 1 2 10 6 2 请在此中选取若干个硬币 使得所取硬币面值总和最大 捡取个数不限 但相邻的硬币不能捡取 请设计相应算法 要求能够输出累加值和选取的硬
  • React的生命周期 和 页面优化

    React的生命周期 和 页面优化 先上React的生命周期图 页面优化问题在 shouldComponentUpdate 函数那里写的 有颜色备注 React声明周期的四个大阶段 Initialization 初始化阶段 Mounting