React 组件生命周期

React生命周期,就是指组件从被创建出来,到被使用,最后被销毁的这么一个过程。而在这个过程中,React提供了我们会自动执行的不同的钩子函数,我们称之为生命周期函数。

一、类式组件

React的生命周期可以分为三个阶段:挂载渲染卸载

1.  Mounting(挂载阶段)------ 创建构造函数并初始化,让我们在页面加载完成前后做一些事情。

  • constructor(构造函数在类组件中比较常见)
  • getDerivedStateFromProps
  • render(render函数)只能访问this.props和this.state,不允许修改状态和DOM输出
  • componentDidMount(组件挂载)------ 一般在这个钩子中做一些初始化的工作,比如:开启定时器,发送网络请求,订阅消息


2. Updating(更新阶段)——状态更新引起的变化,更新页面UI显示或数据更改。

  • getDerivedStateFromProps
  • shouldComponentUpdate
  • render(render函数)------ 渲染组件的UI
  • getSnapshotBeforeUpdate
  • componentDidUpdate(组件更新)------ 可以修改DOM

3. Unmounting(卸载阶段)------ 销毁一个组件,销毁前暴露出一个事件,让我们可以在组件销毁前做一些逻辑的处理。

componentWillUnmount(组件销毁)  ------ 一般在这个钩子中做一些收尾的工作,比如:关闭定时器,取消订阅消息
 

代码示例:

import React from 'react';
import ReactDOM from 'react-dom';class App extends React.Component {// constructor用来初始化组件属性,this.state定义数据,super()为了接收到父类的this指针// 创建构造函数constructor(props) {super(props);this.state = {data: 'Old State'}console.log('初始化数据', constructor);}// 组件将要加载,整个组件还没有加载出来,js逻辑已经可以执行, 异步方法可以放在这里执行componentWillMount() {console.log('componentWillMount');}// 组件加载完成componentDidMount() {console.log('componentDidMount');}// 接收父组件传递过来的参数props时触发componentWillReceiveProps() {console.log('componentWillReceiveProps');}// 判断组件是否需要更新,它需要一个返回值,默认为trueshouldComponentUpdate() {console.log('shouldComponentUpdate');return true; // 需要一个布尔返回值, 比如true或false来判断组件是否要根据值的变化而更新,}// 组件将要更新, 如果shouldComponentUpdate的返回值为true,那这个函数就要为组件更新做准备了// 如果shouldComponentUpdate返回值为false,则组件不会更新,componentWillUpdate,componentDidUpdate都不会执行componentWillUpdate() {console.log('componentWillUpdate');}// 组件更新完成componentDidUpdate() {console.log('componentDidUpdate');}// 处理点击事件handleClick() {console.log('更新数据');this.setState({data: 'New State'})}// 把组件渲染到页面上render() {console.log('render');return (<div><h1>Props:{this.state.data}</h1><button onClick={() => this.handleClick()}>更新数据</button></div>)}
}ReactDOM.render(<div><App /></div>,document.getElementById('app')
)

父子组件初始化
父子组件第一次进行渲染加载时控制台的打印顺序为:

Parent 组件: constructor()
Parent 组件: getDerivedStateFromProps()
Parent 组件: render()
Child 组件:   constructor()
Child 组件:   getDerivedStateFromProps()
Child 组件:   render()
Child 组件:   componentDidMount()
Parent 组件: componentDidMount()
 

父子组件生命周期执行顺序总结
当子组件自身状态改变时,不会对父组件产生副作用的情况下,父组件不会进行更新,即不会触发父组件的生命周期

当父组件中状态发生变化(包括子组件的挂载以及卸载)时,会触发自身对应的生命周期以及子组件的更新

render 以及 render 之前的生命周期,则 父组件先执行
render 以及 render之后的声明周期,则子组件先执行,并且是与父组件交替执行
当子组件进行卸载时,只会执行自身的 componentWillUnmount 生命周期,不会再触发别的生命周期
 

即将废弃的钩子

  • componentWillMount
  • componentWillReceiveProps
  • componentWillUpdate

现在使用会出现警告,下一个大版本需要加上UNSAFE_前缀才能使用,以后可能会被彻底废弃,不建议使用。

  • componentWillMount: 被 UNSAFE_componentWillMount 取代。
  • componentWillReceiveProps: 被 UNSAFE_componentWillReceiveProps 取代。
  • componentWillUpdate: 被 UNSAFE_componentWillUpdate 取代。

这些带有 UNSAFE_ 前缀的函数是 React 在新版本中标记为不安全的生命周期函数,提醒开发者在新代码中避免使用它们。React 团队计划在未来版本中完全移除这些不安全的生命周期函数。
 

二、函数式组件

       在 React 之前的版本中,函数式组件确实没有类组件那样的生命周期方法。这是因为函数式组件最初被设计为纯粹的“无状态”组件,用于简单的 UI 呈现。在这种情况下,组件不需要进行复杂的生命周期管理,因此没有提供生命周期方法。

在 React 中,函数式组件在 React 16.8 版本引入的 Hooks 之后,可以使用 Hooks 来模拟类组件中的生命周期功能。主要用到的是 useEffect 这个 Hook。以下是函数式组件生命周期相关的一些常见钩子:

useEffect

  • useEffect 可以在函数式组件中执行副作用操作,类似于类组件中的 componentDidMountcomponentDidUpdatecomponentWillUnmount 三个生命周期函数的组合。
import React, { useEffect } from 'react';function MyFunctionalComponent() {useEffect(() => {// 在组件挂载后执行,相当于 componentDidMountconsole.log('组件挂载了')// 在组件更新后执行,相当于 componentDidUpdateconsole.log('组件更新了')return () => {console.log('组件即将卸载')// 在组件卸载前执行,相当于 componentWillUnmount};}, [/* dependencies */]); // 可选的依赖数组,当数组中的依赖发生变化时,effect 就会重新执行
}

useLayoutEffect

  • useLayoutEffectuseEffect 类似,但在所有 DOM 变更后同步触发,可以用于获取 DOM 元素的布局信息
import React, { useLayoutEffect } from 'react';function MyFunctionalComponent() {useLayoutEffect(() => {// 在所有 DOM 变更后同步执行}, [/* dependencies */]);
}

useMemo 和 useCallback

  • useMemouseCallback 可以用于性能优化,避免在每次渲染时都重新计算某个值或创建某个函数。
import React, { useMemo, useCallback } from 'react';function MyFunctionalComponent({ data }) {const memoizedValue = useMemo(() => computeExpensiveValue(data), [data]);const memoizedCallback = useCallback(() => {doSomethingWith(memoizedValue);}, [memoizedValue]);// 其他组件逻辑
}

三、什么是React副作用

在 React 中,副作用指的是与组件渲染结果无关的任何操作,例如:

  • 发送网络请求
  • 修改 DOM 元素
  • 访问本地存储
  • 订阅或取消订阅事件
  • 改变组件状态外的变量等

这些操作会影响组件的行为和状态,但是并不会直接影响渲染结果。在 React 中,应该将副作用分离出来,以便更好地控制组件的行为和状态。

通常,React 使用钩子函数(如 useEffect)来处理副作用。在 useEffect 中,可以执行一些副作用操作,例如发送网络请求或订阅事件,以及在组件卸载时清除这些操作。这可以保持组件的一致性和可维护性。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Crow:http请求到Rule绑定的handler_的调用链

Crow:基于req.rul查找路由Rule对象及匹配参数-CSDN博客 介绍了当接收到http请求后如何查找到Rule对象 Connection::do_read -> HTTPParser::feed -> 而feed实际上会依此调用定义于http_parser_settings中的所有函数,并完成http信息的解析 const static http_parser_se…

TensorFlow 2 和 Keras 之间的区别总结

1、什么是TensorFlow 2 TensorFlow 2是谷歌开源的一款深度学习框架&#xff0c;于2019年发布&#xff0c;并且在同年10月1日发布了TensorFlow 2.0.0正式稳定版。这款框架被很多企业与创业公司广泛用于自动化工作任务和开发新系统。 TensorFlow 2在分布式训练支持、可扩展的生…

python使用ctypes访问Windows原生API

在Windows系统中&#xff0c;C语言编写的动态链接库&#xff08;DLL&#xff09;是一种可由多个程序同时使用的代码和数据共享库。DLL文件包含了一些可以被其他程序调用的函数和数据。这些DLL文件通常与应用程序一起发布&#xff0c;并在需要时被加载到内存中&#xff0c;以便应…

【玩转 TableAgent 数据智能分析】股票交易数据分析+预测

文章目录 一、什么是TableAgent二、TableAgent 的特点三、实践前言四、实践准备4.1 打开官网4.2 注册账号4.3 界面介绍4.4 数据准备 五、确认分析需求六、TableAgent体验七、分析结果解读八、总结&展望 一、什么是TableAgent TableAgent是一款面向企业用户的智能数据分析工…

HTML中边框样式、内外边距、盒子模型尺寸计算(附代码图文示例)【详解】

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍HTML中边框样式、内外边距、盒子模型尺寸计算以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问…

js实现给html加水印

创建一个 dom 元素调用下面的方法 var setWatermark (str,dom) > {const id 23.12.18;const element document.getElementById(id); if (element ! null) {element.parentNode.removeChild(element); // 从其父节点中移除该元素}const oBOM document.getElementById(do…

Linux 操作系统 003-系统目录介绍

Linux 操作系统 003-系统目录介绍 本节关键字&#xff1a;Linux、根目录、目录介绍、常用配置文件 本节相关指令&#xff1a; 根目录介绍 目录名称描述/binbinary的缩写&#xff0c;表示二进制文件&#xff0c;bin目录包含了会被所有用户实用的可执行程序。/boot包含与Linux…

用23种设计模式打造一个cocos creator的游戏框架----(二十)解析器模式

1、模式标准 模式名称&#xff1a;解析器模式 模式分类&#xff1a;行为型 模式意图&#xff1a;给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解释器使用该表示来解释语言中的句子。 结构图&#xff1a; 适用于&#xff1…

K8S(十一)—Service详解

目录 Service发布服务&#xff08;服务类型&#xff09;type: ClusterIP选择自己的 IP 地址例子 type: NodePort选择你自己的端口为 type: NodePort 服务自定义 IP 地址配置例子 type: LoadBalancer混合协议类型的负载均衡器禁用负载均衡器节点端口分配设置负载均衡器实现的类别…

java之HikariCP连接池介绍和使用方法 简单易懂!!!

文章目录 一、HikariCP连接池介绍二、导入的jar包三、代码演示配置文件使用配置文件连接运行结果 一、HikariCP连接池介绍 在我们的工作中&#xff0c;免不了要和数据库打交道&#xff0c;而要想和数据库打好交道&#xff0c;选择一款合适的数据库连接池就至关重要&#xff0c…

软件试运行整体方案

一、 试运行目的 &#xff08;一&#xff09; 系统功能、性能与稳定性考核 &#xff08;二&#xff09; 系统在各种环境和工况条件下的工作稳定性和可靠性 &#xff08;三&#xff09; 检验系统实际应用效果和应用功能的完善 &#xff08;四&#xff09; 健全系统运行管理体…

网神防火墙后台用户敏感信息泄露漏洞复现

简介 网神防火墙是一款由中国知名网络安全公司启明星辰开发的防火墙产品。它提供了全面的网络安全防护功能,旨在保护企业网络免受各种网络威胁和攻击。 该产品存在用户账号信息泄露漏洞,通过构造特定数据包,获取防火墙管理员登录的账号密码。 漏洞复现 FOFA语法: body=&…

6TIM定时器

STM32的定时器功能众多&#xff0c;拥有基本定时功能&#xff0c;输出比较功能&#xff08;如产生PWM波等&#xff09;&#xff0c;输入捕获&#xff08;测量方波信号&#xff09;&#xff0c;读取正交编码器的波形。 1.中断原理 TIM定时器的基本功能是对输入的时钟进行计数&…

vue使用xlsx和xlsx-style导出xlsx文件并修改样式

1.下载依赖 npm install xlsx --save npm install file-saver --save npm install xlsx-style --save2.先修改xlsx-style的源码&#xff0c;一旦引入xlsx-style则会报错 在\node_modules\xlsx-style\dist\cpexcel.js 807行 的 var cpt require(’./cpt’ ‘able’); 改成 v…

Python如何画函数图像

1 问题 通过图像可以直观地学习函数变化&#xff0c;在学习函数等方面效果显著。下面我们尝试用Python的2D绘图库matplotlib来绘制函数图像。实现 yx*x 图象。 2 方法 用文字描述解题思路&#xff0c;可配合一些图形以便更好的阐述。解决问题的步骤采用如下方式&#xff1a; …

100GPTS计划-AI写诗PoetofAges

地址 https://chat.openai.com/g/g-Cd5daC0s5-poet-of-ages https://poe.com/PoetofAges 测试 创作一首春天诗歌 创作一首夏天诗歌 创作一首秋天诗歌 创作一首冬天诗歌 微调 诗歌风格 语气&#xff1a;古典 知识库

掌握 Babel:让你的 JavaScript 与时俱进(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

蓝桥杯嵌入式——LED

原理&#xff1a;PD2为使能端&#xff0c;高电平使能。使能的时候&#xff0c;给PC8-PC15高电平即可点亮LED。 CUBE里将这些端口设置为GPIO输出模式&#xff0c;将PC8-15初始电平设置为高电平(这样一上电就不会亮),PD2默认低电平&#xff0c;不用管&#xff0c;然后生成代码即可…

算法通关第十九关-青铜挑战理解动态规划

大家好我是苏麟 , 今天聊聊动态规划 . 动态规划是最热门、最重要的算法思想之一&#xff0c;在面试中大量出现&#xff0c;而且题目整体都偏难一些对于大部人来说&#xff0c;最大的问题是不知道动态规划到底是怎么回事。很多人看教程等&#xff0c;都被里面的状态子问题、状态…

1,探索「两数之和」问题的多种算法解决方案

今天要讨论的是「两数之和」问题&#xff0c;并将从哈希表解法到排序数组与双指针法、再到一遍哈希表解法的不同解决方案进行详细探讨 哈希表解法&#xff1a; 第一&#xff0c;使用了一种简单而有效的方法——哈希表。我们创建了一个 HashMap&#xff0c;用于存储已遍历过的元…