react生命周期

react生命周期

16.3版本之前

  1. 挂载阶段:
    constructor:组件的构造函数(constuctor)部分,继承React Component,在constructor中通过super(props)调用父类React Component的构造函数,才拥有了之后的生命周期。在这个阶段,会获取到外层传递的props数据,这里进行组件初始化的工作,内部state的定义,和组件本身逻辑的初始化。
    componentWillMount: 在组件被挂载到DOM上之前调用,原本在这里也是做一些初始化工作,和调用接口获取初始数据,但是由于和constructor的工作重复,且若在服务端渲染,componentWillMount会在服务端和客户端各自执行一次,这会导致请求两次,而接下来的componentDidMount这会在客户端进行,而且之后有了Fiber之后,由于任务可以中断,componentWillMount可能会被执行多次。
    render: 组件的渲染阶段,props或state有更新的时候,如果没有在shouldComponentUpdate中禁止的话,会触发重新渲染,而DOM层的实际重绘过程是一个复杂的过程,这个过程React会通过虚拟DOM的方式和复杂算法进行处理,这里不做赘述,后续文章会有介绍。render函数是一个纯函数,它的返回只依赖传递的参数。这里不能进行state的更新处理,可能会导致无限循环.
    componentDidMount: 在组件被挂载到DOM上之后调用,只会调用一次,异步数据的获取工作在这里处理。

  2. 更新阶段:
    componentWillReceiveProps:在React16之前,这个生命周期可是非常常用,对于外部传递的props的响应工作在这里处理,比如我的props里传了一个数值变量num,本来num = 1,外部有更新将num变为2,会触发当前组件内也进行更新,在componentWillReceiveProps阶段,我可以获取到prevProps和nextProps,这样我就可以比对,是哪个值变化导致的更新,就可以针对这个变化运行我内部的处理逻辑,可以将外部传的props更新成内部使用的state。
    shouldUpdateComponent:大量的数据更新会触发组件一遍又一遍的更新,会造成不小的性能损耗,这里就需要shouldComponentUpdate来进行优化工作,它有两个参数,nextProps和nextState,在这里通过传的更新后数据和当前数据this.props、this.state里的数据进行比对,可以筛选,哪些变化可以触发重绘,哪些就行拦截,如果拦截,return false。如果返回true,则先进行React elements比对,如果相同,则不会触发重绘,如果不同再进行绘制。
    componentWillUpdate:这个方法会在render之前调用,可以处理一些更新前需要处理的工作。在React16之后会结合新生命周期getDerivedStateFromProps一起来处理props和state的同步问题。
    render:
    componentDidUpdate:这个方法会在render之后调用,在这里可以操作更新后的组件DOM。

  3. 卸载阶段:
    componentWillUnmount:在组件被卸载前调用,这里会处理一些数据清理、定时器清理等工作来避免内存泄露。

render:componentWillReceiveProps、shouldComponentUpdate
precommit:componentWillMount、componentWillUpdate
commit:componentDidMount、componentDidUpdate、componentDidUnmount
在这里插入图片描述

16.3之后版本

  1. 挂载阶段:
    constructor:
    static getDerivedStateFromProps():在调用 render方法之前调用,在初始化和后续更新都会被调用。返回一个对象来更新 state, 如果返回 null 则不更新任何内容。 第一个参数为即将更新的 props, 第二个参数为上一个状态的 state , 可以比较props 和 state来加一些限制条件,防止无用的state更新。注意:getDerivedStateFromProps 是一个静态函数,不能使用this, 也就是只能作一些无副作用的操作
    render:render() 方法是class组件中唯一必须实现的方法,用于渲染dom, render()方法必须返回reactDOM.注意: 不要在 render 里面 setState, 否则会触发死循环导致内存崩溃.
    componentDidMount:在组件挂载后 (插入DOM树后) 立即调用,componentDidMount() 是发送网络请求、启用事件监听方法的好时机,并且可以在 此钩子函数里直接调用 setState()
  2. 更新阶段:
    static getDerivedStateFromProps()
    shouldComponentUpdate(nextProps, nextState):
    在组件更新之前调用,可以控制组件是否进行更新, 返回true时组件更新, 返回false则不更新,包含两个参数,第一个是即将更新的 props 值,第二个是即将跟新后的 state 值,可以根据更新前后的 props 或 state 来比较加一些限制条件,决定是否更新,进行性能优化.
    getSnapshotBeforeUpdate(prevProps, prevState): 在最近一次的渲染输出被提交之前调用。也就是说,在 render 之后,即将对组件进行挂载时调用。它可以使组件在 DOM 真正更新之前捕获一些信息(例如滚动位置),此生命周期返回的任何值都会作为参数传递给 componentDidUpdate()。如不需要传递任何值,那么请返回 null.
    componentDidUpdate(prevProps, prevState, snapshot):包含三个参数,第一个是上一次props值。 第二个是上一次state值。如果组件实现了getSnapshotBeforeUpdate() 生命周期(不常用),第三个是“snapshot” 参数传递.可以进行前后props的比较进行条件语句的限制,来进行 setState() , 否则会导致死循环
  3. 卸载阶段:
    componentWillUnmount:此生命周期是取消网络请求、移除监听事件、清理 DOM 元素、清理定时器等操作的好时机
    render:constructor、getDerivedStateFromProps、shouldComponentUpdate、render
    precommit:getSnapshotBeforeUpdate(prevProps, prevState)
    commit:componentDidMount、componentDidUpdate、componentWillUnmount
    在这里插入图片描述

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

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

相关文章

C语言程序环境和预处理

本章主要以图片和文字的形式给大家讲解 程序的翻译环境和程序的执行环境 在ANSI C的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码 2. 详解编译…

python 中禁用 SettingWithCopyWarning

最近代码中出现了这个warn,但是我确信我已经把所有的df赋值都改成loc了,依旧会出现,只有把这个warn禁了。 import pandas as pd import warnings# 禁用 SettingWithCopyWarning 警告 warnings.filterwarnings("ignore", categorypd…

【Kafka】Kafka基础操作笔记

【Kafka】Kafka基础操作笔记 文章目录 【Kafka】Kafka基础操作笔记1. 两种模式1.1 点对点模式1.2 发布/订阅模式 2. 基础架构3. Topic命令行操作3.1 查看 Topic 操作3.2 创建 Topic3.3 查看所有 Topic3.4 查看 Topic 的详情3.5 修改分区数3.6 删除 Topic 1. 两种模式 Kafka作为…

K8S应用生命周期管理

K8S应用生命周期管理. 1 应用周期管理1.1 资源对象1.1.1 基础知识1.1.2 资源属性 1.2 Pod基础1.2.1 Pod概述1.2.2 简单实践1.2.3 流程解读1.2.4 应用解析1.2.5 初始化容器1.2.6 Sidecar实践1.2.7 静态POD实践 1.3 Pod进阶1.3.1 Pod探测机制1.3.2 命令探测1.3.3 TCP探测1.3.4 HT…

服务无法注册进Eureka

相同的配置,在demo里能注册,在自己项目的无法注册,眼睛都快盯出老花眼了,还是不行,果然出现的问题只有在发现问题以后才觉得简单(虽然确实是小问题,但是排查了一整天,值得记录一下&a…

3-Spring cloud之搭建Ribbon负载均衡——服务器上实操(上)

3-Spring cloud之搭建Ribbon负载均衡——服务器上实操(上) 1. 前言2. ribbon整合eureka入门2.1 修改相关配置2.1.1 修改服务消费者pom,引入ribbon相关依赖2.1.2 修改服务消费者yml,将客户端注册进eureka服务列表内2.1.3 修改配置类…

用户与组管理介绍

文章目录 一、服务器系统版本介绍二、用户管理1. 用户概述2. 内置账户3. 配置文件4. 用户管理命令 三、组管理1. 组概述2. 内置组(系统自带的组)3. 组管理命令 一、服务器系统版本介绍 Windows服务器系统:win2000、win2003、win2008、win2012…

charles 如何获取电脑端微信小程序接口

安装证书 设置代理端口 即可抓取美团酒店小程序的数据 从charles 可以抓取出header 请求,没有所谓的通过遍历循环能简单的得到数据,请求包含加密信息 随便改下数据就是 所以如果要得到这些数据,还非得通过小程序模拟人滑动获取数据&…

<QT开发> QT开发工具-之-QT应用程序打包

<QT开发> QT开发工具-之-QT应用程序打包 一 前言 笔者为什么会写这篇文章呢?这是因为,笔者使用windows QT开发了一个测试工具。目的是通过TCP/IP测试其它应用程序。首先这个QT程序是笔者自己开发的,所以笔者的电脑当…

【数学建模】国赛真题分析 2012 A题 葡萄酒的评价

2012 A题 葡萄酒的评价 优秀论文地址: 链接:https://pan.baidu.com/s/19WGpybgM6RncxTYhx61JRA?pwdvl22 提取码:vl22 –来自百度网盘超级会员V6的分享 确定葡萄酒质量时一般是通过聘请一批有资质的评酒员进行品评。每个评酒员在对葡萄酒进…

万能的微信小程序个人主页:商城系统个人主页、外卖系统个人主页、购票系统个人主页等等【全部源代码分享+页面效果展示+直接复制粘贴编译即可】

前言 以下给出来四个常见的小程序个人主页,分别是商城系统个人主页,外卖系统个人主页,挂号系统个人主页,电影购票系统个人主页。包括完整的页面布局代码,完整的样式代码。使用的时候,只需要将页面代码和样式代码复制到自己项目对应的页面即可。而且可以根据已有代码只需稍…

【Go】Go 语言教程--语言变量(五)

往期教程: Go 语言教程–介绍(一)Go 语言教程–语言结构(二)Go 语言教程–语言结构(三)Go 语言教程–数据类型(四) 文章目录 变量声明多变量声明值类型和引用类型简短形…