react-组件生命周期

一、生命周期阶段

官方文档:https://zh-hans.legacy.reactjs.org/docs/react-component.html

React组件生命周期可分为三个阶段:挂载、更新、卸载

  • 挂载:当组件实例被创建并插入 DOM 中时。其生命周期调用顺序如下:

    • constructor()
    • static getDerivedStateFromProps()
    • render()
    • componentDidMount()
  • 更新:当组件的 props 或 state 发生变化时会触发更新。组件更新的生命周期调用顺序如下:

    • static getDerivedStateFromProps()
    • shouldComponentUpdate()
    • render()
    • getSnapshotBeforeUpdate()
    • componentDidUpdate()
  • 卸载:当组件从 DOM 中移除时

    • componentWillUnmount()

组件生命周期图谱:https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/

  • 常用生命周期图谱:

在这里插入图片描述

  • 完整生命周期图谱:

在这里插入图片描述

二、常用生命周期方法

方法触发时机作用说明
constructor()组件挂载之前,会调用它的构造函数1、初始化state
2、为事件处理程序绑定实例
如果不初始化 state 或不进行方法绑定,则不需要为 React 组件实现构造函数
render()每次组件渲染都会触发渲染UI1、render() 方法是 class 组件中唯一必须实现的方法
2、render() 方法必须有返回值
componentDidMount()组件挂载后(插入 DOM 树中)立即调用1、发送网络请求
2、DOM操作
这个方法是比较适合添加订阅的地方
componentDidUpdate()更新后会被立即调用1、发送网络请求
2、DOM操作
1、如果这里要调用 setState(),必须放在一个如 if 的条件语句中,否则会导致死循环
2、语法:componentDidUpdate(prevProps, prevState, snapshot)
componentWillUnmount()组件卸载及销毁之前直接调用执行清理工作(如:移除监听、清理定时器、取消订阅等)

三、不常用生命周期方法

方法触发时机作用说明
shouldComponentUpdate()当 props 或 state 发生变化时,在 render() 执行之前被调用判断 React 组件的输出是否受当前 state 或 props 更改的影响1、返回布尔值,默认 true
2、语法:shouldComponentUpdate(nextProps, nextState)
3、此方法仅作为性能优化的方式而存在
getDerivedStateFromProps()在调用 render() 之前调用,并且在初始挂载及后续更新时都会被调用此方法适用于罕见的用例,即 state 的值在任何时候都取决于 props1、返回一个对象来更新 state,如果返回 null 则不更新任何内容
2、语法:static getDerivedStateFromProps(props, state)
3、此方法无权访问组件实例
getSnapshotBeforeUpdate()在最近一次渲染输出(提交到 DOM 节点)之前调用它使得组件能在发生更改之前从 DOM 中捕获一些信息(例如,滚动位置)1、返回 snapshot 的值(或 null)
2、语法:getSnapshotBeforeUpdate(prevProps, prevState)

此外,涉及错误边界的两个方法getDerivedStateFromError()componentDidCatch()请参考官方文档

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

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

相关文章

接口请求重试的8种写法,你用哪种?

大家好,我是老三,最近比较忙碌,一个多月没写原创文章了,把以前的一篇旧稿整理整理,混一期。 大家都知道老三是做跨境业务的,在跨境业务中,可能第三方的服务器分布在世界的各个角落,…

【唠唠嵌入式】__如何学习单片机?

目录 前言 个人定位,从事软件还是硬件? 学习内容 (* ̄︶ ̄)创作不易!期待你们的 点赞、收藏和评论喔。 前言 作为一个老司机,多年来跟单片机、Keil、C语言、AD、烙铁、风枪、示波器、电子元器件纠缠不清…

内网渗透-域信息收集

域环境 虚拟机应用:vmware17 域控主机:win2008 2r 域成员主机:win2008 2r win7 一.域用户和本地用户区别 使用本地用户安装程序时,可以直接安装 使用域用户安装程序时,需要输入域控管理员的账号密码才能安装。总结…

【优选算法系列】第一节.哈希表简介(1. 两数之和and面试题 01.02. 判定是否互为字符重排)

文章目录 前言一、哈希表简介二、两数之和 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写三、判定是否互为字符重排 3.1 题目描述 3.2 题目解析 3.2.1 算法原理 3.2.2 代码编写总结 前言 一…

【QT开发(17)】2023-QT 5.14.2实现Android开发

1、简介 搭建Qt For Android开发环境需要安装的软件有: JAVA SDK (jdk 有apt install 安装) Android SDK Android NDKQT官网的介绍: Different Qt versions depend on different NDK versions, as listed below: Qt versionNDK…

编程助手DevChat:让开发更轻松

#AI编程助手哪家好?DevChat“真”好用 # 目录 前言一、安装Vscode1、下载链接2、安装 二、注册DevChat1、打开注册页2、验证成功完成邮箱绑定3、绑定微信可获得8元 三、安装插件四、配置Access Key1、获取Access Key2、设置Access Key①、点击左下角管理&#xff08…

一种使用wireshark快速分析抓包文件amr音频流的思路方法

解决方案: 1. 使用wireshark过滤amr,并导出原始数据文件; 2.使用ue的二进制编辑模式,编辑该文件,添加amr头,6个字节数据“#!AMR”,字节数据为 23 21 41 4D 52 0A 3.修正格式:通过抓包发现&#…

Linux--jdk,tomca,mysql安装、后端项目搭建

一、JDK和Tomcat的安装 1.JDK安装 直接上传到Linux服务器的,上传jdk、tomcat安装包 解压JDK安装包 //解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 置环境变量(JAVA_HOME和PATH) vim /etc/profile 在文件末尾添加以下内容: //java environment expo…

torch.div()不支持rounding_mode参数

问题怎么定位的呢,把报错信息一股脑甩给chatgpt,问他什么意思,他就反馈说“在标准的Python库中,div() 函数不接受 rounding_mode 参数。”(虽然这个问题也不难,但是改偷的懒还是要偷) 问题再现…

代码随想录算法训练营第四十天丨 动态规划part03

343. 整数拆分 思路 看到这道题目,都会想拆成两个呢,还是三个呢,还是四个.... 来看一下如何使用动规来解决。 动态规划 动规五部曲,分析如下: 确定dp数组(dp table)以及下标的含义 dp[i]…

杂货铺 | 报错记录(持续更新)

文章目录 ⚠️python SyntaxError: Non-UTF-8 code starting with ‘\xb3‘ in file⚠️partially initialized module ‘‘ has no attribute ‘‘(most likely due to a circular import)⚠️AttributeError: ‘DataFrame‘ object has no attribute ‘append‘ ⚠️python S…

loadsh

官网(当前版本4.x)Lodash Documentationhttps://lodash.com/docs/4.17.15 简介 Lodash是一个著名的javascript原生库,不需要引入其他第三方依赖。是一个意在提高开发者效率,提高JS原生方法性能的JS库。简单的说就是,很多方法loda…