React的生命周期

生命周期图谱: React lifecycle methods diagram

生命周期三大阶段

挂载阶段

流程: constructor ==> render ==> componentDidMount

触发: ReactDOM.render(): 渲染组件元素

更新阶段

流程: render ==> componentDidUpdate

触发: setState() , forceUpdate(), 组件接收到新的props

卸载阶段

流程: componentWillUnmount

触发: 不再渲染组件

1.挂载阶段示例

父组件代码App.jsx

import React, { Component } from "react";
import Child from "./components/Child21";export default class App extends Component {constructor() {super()console.log("App constructor");}render() {console.log("App render");return (<div><h3>App</h3><Child /></div>);}componentDidMount() {console.log("App componentDidMount");}
}

子组件代码 Child.jsx

import React, { Component } from 'react'export default class Child extends Component {constructor(){super()console.log(' child constructor')}render() {console.log('child render')return (<div>Child</div>)}componentDidMount(){console.log('child componentDidMount')}
}

如图所示:

以上跟据生命周期图谱可得

  1. 初始化时,首先运行constructor()进行组件实例化与状态初始化。
  2. 随后执行render()方法生成组件的虚拟DOM,并在此过程中同样按照此顺序执行所有子组件的构造函数及render方法
  3. 组件首次渲染到DOM后,触发componentDidMount();在组件接收到新的props或state并完成渲染更新后,则执行componentDidUpdate()方法。这两个方法常用于在组件挂载后或更新后的附加处理操作。

2.更新阶段示例

触发组件能够重 新render的条件有三个

1:new Props:组件接收到新的props

2:setState

3:forceUpdate()  强制更新

App.jsx

import React, { Component } from 'react'
import Child from './components/Child22'
// import Life from './components/Life'export default class App extends Component {// component组件  Did 完成  Mount 挂载componentDidMount() {console.log('App componentDidMount')/*** 1. 请求ajax数据* 2. 频道订阅* 3. 开启定时器*/}// 定义状态state = {count:0}constructor() {super()console.log('App constructor')// 可以修改状态,但是不触发render方法  this.setStatethis.state.count = 1// 增加状态this.state.msg = 'AAA'}render() {console.log('App render')// console.log(this.state)let {count,msg} = this.statereturn (<div><h3>App</h3><p>state-- count: {count}</p><p>state-- msg : {msg}</p><p><button onClick={()=>{this.setState({count:this.state.count + 1})}}>改变count</button></p><p><button onClick={()=>{this.setState({msg:this.state.msg + '-'})}}>改变 msg</button></p><p><button onClick={()=>{this.forceUpdate()}}>强制更新</button></p><hr /><Child count={count}/><hr />{/* <Life msg={msg}/> */}</div>)}}

Child.jsx

import React, { Component } from 'react'export default class Child extends Component {constructor(){super()console.log(' child constructor')}render() {console.log('child render')let {count} = this.propsreturn (<div><h4>Child</h4><p>props-- count : {count}</p></div>)}componentDidMount(){console.log('child componentDidMount')}
}

由此可得:当有组件嵌套的时候,父组件更新了,子组件不管数据是否发生变化,一律无脑更新  

另外:自身状态[state]和外部传入数据[props],都不改变的时候,不执行render方法

3.shouldComponentUpdate 确定是否可以跳过重新渲染

官方文档:Component – React 中文文档

shouldComponentUpdate(nextProps, nextState, nextContext)

  • nextProps:组件即将用来渲染的下一个 props。将 nextProps 与 this.props 进行比较以确定发生了什么变化。
  • nextState:组件即将渲染的下一个 state。将 nextState 与 this.state 进行比较以确定发生了什么变化。
  • nextContext:组件将要渲染的下一个 context。将 nextContext 与 this.context 进行比较以确定发生了什么变化。仅当你指定了 static contextType(更新的)或 static contextTypes(旧版)时才可用。
返回值 

如果你希望组件重新渲染的话就返回 true。这是也是默认执行的操作。

返回 false 来告诉 React 可以跳过重新渲染。

 /*** * @param {*} nextProps  要更新的最新的props* @param {*} nextState  要更新的最新的state*/shouldComponentUpdate(nextProps,nextState){// console.log('nextProps',nextProps)// console.log(this.props);//return true; // 更新//return false; // 不更新,后续render不会执行// 判定外部传入的props变化与否for(let attr in nextProps){if(nextProps[attr] !== this.props[attr]){return true;}}// 判定自身状态变化,是否需要更新for(let attr in nextState){if(nextState[attr] !== this.state[attr]){return true;}}return false;}

3.卸载阶段示例

componentWillUnmount: 组件即将卸载前执行

App.jsx 父组件代码

import React, { Component } from 'react'
import Life from './components/Life24'export default class App extends Component {// 定义状态state = {flag:true}render() {let {flag} = this.statereturn (<div><h3>App</h3><button onClick={()=>{this.setState({flag:!this.state.flag})}}>切换显示</button><hr />{ flag && <Life/>}</div>)}}

Life.jsx 组件代码

import React, { Component } from "react";export default class Life extends Component {constructor() {super();console.log("Life constructor");}render() {console.log("Life render");return <div>Life</div>;}componentDidMount() {console.log("Life componentDidMount");}componentWillUnmount() {console.log("Life componentWillUnmount");}
}

总结:

生命周期钩子

  • constructor:

    只执行一次: 创建组件对象挂载第一个调用

    用于初始化state属性或其它的实例属性或方法(可以简写到类体中)

  • render:

    执行多次: 挂载一次 + 每次state/props更新都会调用

    用于返回要初始显示或更新显示的虚拟DOM界面

  • componentDidMount:

    执行一次: 在第一次调用render且组件界面已显示之后调用

    用于初始执行一个异步操作: 发ajax请求/启动定时器等

    应用:

    1. 启动定时器

    2. 订阅消息

    3. 发送ajax请求

  • componentDidUpdate:

    执行多次: 组件界面更新(真实DOM更新)之后调用

    用于数据变化后, 就会要自动做一些相关的工作(比如: 存储数据/发请求)

    用得少 => 这次我们先简单了解, 后面需要时再深入说

  • componentWillUnmount:

    执行一次: 在组件卸载前调用

    用于做一些收尾工作, 如: 清除定时器、取消订阅

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

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

相关文章

JS+CSS3点击粒子烟花动画js特效

JSCSS3点击粒子烟花动画js特效 JSCSS3点击粒子烟花动画js特效

【python】Anaconda安装后打不开jupyter notebook(网页不自动跳出)

文章目录 一、遇到的问题&#xff1a;jupyter notebook网页不自动跳出&#xff08;一&#xff09;输入jupyter notebook命令&#xff08;二&#xff09;手动打开网页 二、解决办法&#xff1a;指定浏览器&#xff08;一&#xff09;找文件 jupyter_notebook_config.py&#xff…

JVM常用垃圾收集器

JVM 4.1 哪些对象可以作为GC ROOT? 虚拟机栈&#xff08;栈帧中的局部变量表&#xff09;中引用的对象本地方法栈中引用的对象方法区静态变量引用的对象方法区常量引用的对象被同步锁持有的对象JNI&#xff08;Java Native Interface&#xff09;引用的对象 4.2 常用垃圾收集…

Spring Boot 自动化单元测试类的编写过程

前言 Web环境模拟测试 企业开发不仅要保障业务层与数据层的功能安全有效&#xff0c;也要保障表现层的功能正常。但是我们一般对表现层的测试都是通过postman手工测试的&#xff0c;并没有在打包过程中代码体现表现层功能被测试通过。那么能否在测试用例中对表现层进行功能测…

【重温设计模式】状态模式及其Java示例

状态模式的基本概念 在编程世界的大海中&#xff0c;各种设计模式就如同灯塔&#xff0c;为我们的代码编写指明方向。其中&#xff0c;状态模式是一种行为设计模式&#xff0c;它让你能在一个对象的内部状态改变时改变其行为&#xff0c;使得对象看起来就像改变了其类一样。这…

微信小程序原生<map>地图实现标记多个位置以及map 组件 callout 自定义气泡

一、老规矩先上效果图: 二、在pages文件夹下新建image文件夹用来存放标记的图片。 三、代码片段 也可以参考小程序文档:https://developers.weixin.qq.com/miniprogram/dev/component/map.html index.wxml代码 <mapid="map"style="width: 100%; height:1…

企业专业化管理金字塔:技能进阶与案例分析

在纷繁复杂的企业管理领域中&#xff0c;一套行之有效的管理技能体系对于企业的稳健发展至关重要。本文将深入探讨企业专业化管理金字塔的五个层次&#xff1a;基本的管理技能、业务操作管理技能、组织管理技能、组织开发技能以及管理转变技能&#xff0c;并结合实际案例&#…

mac电脑修改终端zsh显示的用户名

电脑名称一直没有修改&#xff0c;所以电脑名称都是Apple的MacBook Pro&#xff0c;如下图所示&#xff1a; mac电脑终端显示用户名太长一点也不美观&#xff0c;而且占用很长的行&#xff0c;浪费空间&#xff0c;可以通过修改来调整要显示什么内容&#xff1a; 方式一 要想换…

rabbitmq-spring-boot-start配置使用手册

rabbitmq-spring-boot-start配置使用手册 文章目录 1.yaml配置如下2.引入pom依赖如下2.1 引入项目resources下libs中的jar包依赖如下2.2引入maven私服依赖如下 3.启动类配置如下4.项目中测试发送消息如下5.项目中消费消息代码示例6.mq管理后台交换机队列创建及路由绑定关系如下…

信息检索(十三):On Complementarity Objectives for Hybrid Retrieval

On Complementarity Objectives for Hybrid Retrieval 摘要1. 引言2. 相关工作2.1 稀疏和密集检索2.2 互补性 3. 提出方法3.1 Ratio of Complementarity (RoC)3.2 词汇表示&#xff08;S&#xff09;3.3 语义表示&#xff08;D&#xff09;3.4 互补目标 4. 实验4.1 实验设置4.2…

关系数据库:关系数据结构基础与概念解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Nginx学习与使用

Nginx 什么是NginxNginx命令Nginx 配置文件文件组成全局块&#xff1a;配置服务器整体运行的配置指令Events块&#xff1a;影响Nginx服务器与用户的网络连接Http块Http全局块Server块全局Server快Location块 配置实例Nginx配置实例——反向代理 什么是Nginx Nginx命令 1.使用…

湖北省地质灾害分布数据 崩塌滑坡泥石流空间分布地质灾害详查等数据集

地质灾害是指在自然或者人为因素的作用下形成的&#xff0c;对人类生命财产造成的损失、对环境造成破坏的地质作用或地质现象。地质灾害在时间和空间上的分布变化规律&#xff0c;既受制于自然环境&#xff0c;又与人类活动有关&#xff0c;往往是人类与自然界相互作用的结果。…

数据资产管理解决方案:构建高效、安全的数据生态体系

在数字化时代&#xff0c;数据已成为企业最重要的资产之一。然而&#xff0c;如何有效管理和利用这些数据资产&#xff0c;却是许多企业面临的难题。本文将详细介绍数据资产管理解决方案&#xff0c;帮助企业构建高效、安全的数据生态体系。 一、引言 在信息化浪潮的推动下&a…

Geostationary IR Channel Brightness Temperature - GridSat B1 -- shell下载

进入网页 https://www.ncei.noaa.gov/products/gridded-geostationary-brightness-temperature 然后进入数据目录&#xff0c;通过https的方式进行下载&#xff1a; 点击后进入如下界面&#xff1a; 点击任意年份进行下载 这里以2004年为例&#xff0c;如下所示&#xff1…

Go语言中的锁与管道的运用

目录 1.前言 2.锁解决方案 3.管道解决方案 4.总结 1.前言 在写H5小游戏的时候&#xff0c;由于需要对多个WebSocket连接进行增、删、查的管理和对已经建立连接的WebSocket通过服务端进行游戏数据交换的需求。于是定义了一个全局的map集合进行连接的管理&#xff0c;让所有…

力扣每日一道系列 --- LeetCode 160. 相交链表

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构探索 ✅LeetCode每日一道 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 LeetCode 160. 相交链表 思路&#xff1a; 首先计算两个链表的长度&#xff0c;然后判断两个链…

华为组网:核心交换机旁挂防火墙,基于ACL重定向配置实验

如图所示&#xff0c;由于业务需要&#xff0c;用户有访问Internet的需求。 用户通过接入层交换机SwitchB和核心层交换机SwitchA以及接入网关Router与Internet进行通信。为了保证数据和网络的安全性&#xff0c;用户希望保证Internet到服务器全部流量的安全性&#xff0c;配置重…

海外社交营销为什么用云手机?不用普通手机?

海外社交营销作为企业拓展海外市场的重要手段&#xff0c;正日益受到企业的青睐。云手机以其成本效益和全球性特征&#xff0c;成为海外社交营销领域的得力助手。那么&#xff0c;究竟是什么特性使得越来越多的企业选择利用云手机进行海外社交营销呢&#xff1f;下文将对此进行…

ARM 寄存器学习:(一)arm多种模式下得寄存器

一.ARM7种状态以及每种状态的寄存器&#xff1a; ARM 处理器共有 7 种不同的处理器模式&#xff0c;在每一种处理器模式中可见的寄存器包括 15 个通用寄存器( R0~R14)、一个或两个(User和Sys不是异常模式&#xff0c;没有spsr寄存器)状态寄存器&#xff08;cpsr和spsr&…