react生命周期

ops/2024/10/18 23:27:16/

react 的生命周期

react15 的生命周期

javascript">constructor(); // 组件构建
componentWillReceiveProps(); // 要接受父组件参数
shouldComponetUpdate(); // 组件是否更新
componentWillMount(); // 组件将要渲染
componentWillUpdate(); // 组件将要更新
componentDidUpdate(); // 组件更新完成
componentDidMount(); // 组件渲染完成
render(); // 渲染
componentWillUnmount(); // 组件将要卸载

在这里插入图片描述

生命周期流程为外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
组件第一次挂载的时候: constructor -> componentWillMount -> render -> componentDidMount
组件更新的时候: componentWillReceiveProps -> shouldComponentUpdate -> componentWillUpdate -> render -> componentDidUpdate
组件卸载的时候执行: componentWillUnmount

react16

在这里插入图片描述

javascript">constructor();
getDerivedStateFromProps();
shouldComponentUpdate();
render();
cmoponentDidMount();
componentDidUpdate();
componentWillUnmount();

组件挂载: consturctor -> getDerivedStateFromProps -> render -> componentDidMount
组件更新: getDerivedStateFromProps -> shouldComponentUpdate -> render -> getSnapshotBeforeUpdate -> componentDidUpdate
组件卸载时执行: componentWillUnmount
react 废弃了 componentWillMount componentWillReceiveProps componentWillUpdate 这三个生命周期钩子函数

各个生命周期函数

consturctor

如果不初始化 state 或者不进行方法绑定,则不需要为 react 组件实现构造函数,在 react 组件挂载之前,会调用他的构造函数,在为 react.conponent 子类实现构造函数的时候,应该在其他语句之前调用 super(props),否则,this.props 在构造函数重会出现没有定义的 bug
用于 1. 通过给 this.state 赋值对象来初始化内部 state 2. 为事件处理函数绑定实例
在 constructor 函数重,不需要使用 setState 方法,如果组件需要使用内部的 state,需要在构造函数中 this.state 赋值初始 state
只会执行一次,调用该方法会换回一个组件实例,在初始化阶段,可以直接对 this.state 赋值,其他生命周期重智能通过 this.setState 修改 state,不能直接对 this.state 赋值。

componentWillReceiveProps

在已经挂载的组件接收到新的 props 的之前调用,可以在这个函数重比较新旧 props,并且根据新旧 props 来更改 state,会破坏 props 数据的单一数据源,在首次渲染逐渐的时候,不会使用这个生命周期,
如果父组件渲染导致了组件的重新渲染,即使传递给组件的 props 没有发生变化,这个组件的生命周期也会发生调用。

getDerivedStateFromProps

是一个静态方法,接受 props 和 state 两个参数,会在调用 render 方法之前被调用,不管是在初始挂载还是在后续组件更新的时候,都会被调用
调用时机和 componentWillMount, commponentWillUpdate, componentWillReceiveProps 一样都是在 render 方法之前调用,可以作为三者的替代方案。
这个方法是类的静态方法,不是原型中的方法,在内部使用 this 访问的不是组件的实例

shouldComponentUpdate

在组件更新之前使用,但是首次渲染或者是 forceUpdate 函数的时候不会调用。当组件的 props 或者是 state 发生变化的时候,会导致组件的更新,在 render 方法之前执行,如果返回值是 false,则不会更新组件,也不会执行后面的 render 方法
接受两个参数,nextProps 和 nextstate,下一次更新的 props 和下一次更新的 state,可以将 this.props 和 nextProps 作比较,返回 false,让组件跳过更新,但是不会阻止组件因为 state 而导致的更新
这个生命周期,可以用来做性能优化

componentWillMount

在组件挂载到 dom 之前调用,并且只会调用一次,在 render 方法执行,可以在 componmentWillMount 中调用 this.setState 不会触发额外的渲染

componentWillUpdate

在组件即将更新之前执行,如果 shouldComponentUpdate 函数返回 false,不会调用 componentWillUpdate 方法

render

render 方法是类组件中的一种必须实现的方法,返回值作为页面渲染的试图,render 函数应该作为纯函数,对于相同的 state 和 props,总是返回相同的渲染结果
render 函数被调用的时候,会返回这四种类型

  1. react 元素,jsx 语法
  2. 数组或者 fragments: render 方法可以通过数组返回多个元素
  3. portals: 渲染子节点到不同的子树中
  4. 字符串或者数值:会作为文本节点被渲染
  5. boolean 类型或者是 null: 什么都不渲染
getSnapshotBeforeUpdate

这个生命周期在最近一次渲染直提交 dom 之前执行,这个时候 dom 树没有改变,可以在这里获取 dom 改变前的信息。接受两个参数,prevprops, prevstate,上一个状态的 pros 和上一个状态的 state。它的返回值会将传递给 componentDiupdate 的生命周期钩子的第三个参数
需要获取更新前 Dome 的信息时比如说需要使用特殊方法去处理滚动的聊天线程等

componentDidupdate

在组件更新后立即调用,首次渲染不会调用该方法.它的执行时机和 componentdidMount 一致,只是 componentDidmount 在首次渲染的时候调用而 componentdidupdate 是在后续的组件更新时候调用,这个生命周期中可以直接使用 this.set state ,但是必须包含在一个条件语句中否则会导致死循环

componentDidMount

该生命周期方法会在组件挂载之后执行,也就是会执行一次,将组件对应的dom插入到dom树之后调用,在浏览器更新视图之前调用,如果在componentDidMount中直接调用this.setState,会触发额外的渲染,会再一次使用render函数,但是浏览器中更新视图的方法只会执行一次
依赖于dom初始化的操作可以放在这里,也可以在这个生命周期中发送网络请求。

componentWillUnmount

这个生命周期在组件卸载以及销毁之前调用,通常用来执行组件的清理操作


http://www.ppmy.cn/ops/122335.html

相关文章

基于CNN+Transformer混合模型实现交通流量时序预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…

大数据毕设方向怎么做

文章目录 🚩 1 前言1.1 选题注意事项1.1.1 难度怎么把控?1.1.2 题目名称怎么取? 1.2 开题选题推荐1.2.1 起因1.2.2 核心- 如何避坑(重中之重)1.2.3 怎么办呢? 🚩2 选题概览🚩 3 项目概览题目1 : 基于协同过…

【大数据】Flink CDC 实时同步mysql数据

目录 一、前言 二、Flink CDC介绍 2.1 什么是Flink CDC 2.2 Flink CDC 特点 2.3 Flink CDC 核心工作原理 2.4 Flink CDC 使用场景 三、常用的数据同步方案对比 3.1 数据同步概述 3.1.1 数据同步来源 3.2 常用的数据同步方案汇总 3.3 为什么推荐Flink CDC 3.4 Flink …

Mac屏蔽系统更新,取出红点标记如果解锁hosts文件

引言:关闭系统更新,首先应该在系统偏好设置---软件更新---去掉自动更新的选项。即使如此,系统仍然进行macOS系统和自带safari等软件的检测更新,并图标右上角红点点标记提醒我们更新,那我们如果彻底屏蔽更新呢&#xff…

AI换脸技术新纪元:直播与视频创作的新利器

在数字媒体时代,实时面部交换技术正变得越来越流行。它不仅为视频创作者提供了新的表达方式,也为直播行业带来了革命性的变化。以下是一些目前市场上领先的实时面部交换软件: 🌟 FaceFusion FaceFusion 是一款功能强大的实时面部…

MongoDB 快速入门+单机部署(附带脚本)

目录 介绍 体系结构 数据模型 BSON BSON 数据类型 特点 高性能 高可用 高扩展 丰富的查询支持 其他特点 部署 单机部署 普通安装 脚本安装 Docker Compose 安装 卸载 停止 MongoDB 删除包 删除数据目录 参考: https://docs.mongoing.com/ 介绍…

Spring Boot电商开发:购物商城系统

第2章 关键技术简介 2.1 Java技术 Java是一种非常常用的编程语言,在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中,Java的身影无处不在,并且拥有旺盛的生命力。Java的跨平台能力十分强大,只需一次编译&#xf…

Raspberry Pi3B+之Rpanion(gst)和ffmpeg验证

Raspberry Pi3B之Rpanion-gst和ffmpeg验证 1. 源由2. 分析3. 环境搭建步骤1:安装镜像步骤2:系统更新步骤3:安装numpy组件步骤4:安装python3-picamera2组件步骤4:安装cv2组件步骤5:安装ffmpeg组件步骤6&…