React学习笔记(四)——React 组件生命周期

目录

1. 生命周期-概览

2. 生命周期-挂载阶段

3. 生命周期-更新阶段

4. 生命周期-卸载阶段

5. setState扩展-发现问题

6. setState扩展-更多用法

 7. setState扩展-异步


1. 生命周期-概览

了解react类组件生命周期整体情况

大致步骤:

  • 什么是生命周期
  • React类组件的生命周期整体概览
  • 了解生命周期的意义

具体内容:

① 什么是组件生命周期

  • 一个事物从创建到最后消亡经历的整个过程

② React类组件的生命周期整体概览,组件从创建到消耗的过程

React组件生命周期

③ 了解生命周期的意义

  • 助于理解组件的运行方式、完成更复杂的组件功能、分析组件错误原因
  • 钩子函数为开发人员在不同阶段操作组件提供了时机

总结:

  • 只有类组件才有生命周期,分为 挂载阶段 更新阶段 卸载阶段

2. 生命周期-挂载阶段

够说出组件的挂载阶段的钩子函数以及执行时机

大致步骤:

  • 知道挂载阶段会执行那些函数,执行顺序
  • 知道每个函数内一般可以做什么事
  • 参考代码

具体内容:

① 知道挂载阶段会执行那些函数,执行顺序

② 知道每个函数内一般可以做什么事

钩子 函数触发时机作用
constructor创建组件时,最先执行1. 初始化state 2. 创建 Ref 3. 使用 bind 解决 this 指向问题等
render每次组件渲染都会触发渲染UI(注意: 不能调用setState() )
componentDidMount组件挂载(完成DOM渲染)后1. 发送网络请求 2.DOM操作

③ 参考代码

import { Component } from 'react'export default class App extends Component {constructor () {super()console.log('1. constructor执行')}componentDidMount () {console.log('3. componentDidMount执行')}render() {console.log('2. render执行')return <div>App组件</div>}
}

总结:

  • 组件挂载阶段,顺序执行 constructor render componentDidMount 三个函数

3. 生命周期-更新阶段

能够说出组件的更新阶段的钩子函数以及执行时机

大致步骤:

  • 知道更新阶段会执行那些函数,执行顺序
  • 知道何时触发更新阶段
  • 知道触发的钩子函数里可以做些什么
  • 参考代码

具体内容:

① 更新阶段会执行那些函数,执行顺序

② 何时触发更新阶段

  • setState()
  • forceUpdate() 强制组件更新
  • 组件接收到新的props(实际上,只需要父组件更新,子组件就会重新渲染)

③ 钩子函数里可以做什么

钩子函数触发时机作用
render每次组件渲染都会触发渲染UI(与 挂载阶段 是同一个render)
componentDidUpdate组件更新(完成DOM渲染)后DOM操作,可以获取到更新后的DOM内容,不要直接调用setState

④ 参考代码

import { Component } from 'react'class Child extends Component {render() {return <h1>统计豆豆被打的次数:</h1>}
}export default class App extends Component {state = {count: 0}handleClick = () => {this.setState({count: this.state.count + 1})}componentDidUpdate() {console.log('2. componentDidUpdate执行')}render() {console.log('1. render执行')return (<div><Child /><button onClick={this.handleClick}>打豆豆</button></div>)}
}

总结:

  • 组件更新会触发 componentDidUpdate 钩子函数

4. 生命周期-卸载阶段

能够说出组件的销毁阶段的钩子函数以及执行时机

大致步骤:

  • 什么时候触发卸载
  • 卸载阶段执行那些钩子函数,一般做什么事情
  • 参考代码
  • 演示清理工作

具体内容:

① 什么时候触发卸载?

  • 在组件被移除的时候(消失)触发卸载阶段

② 卸载阶段执行那些钩子函数,一般做什么事情

钩子函数触发时机作用
componentWillUnmount组件卸载(从页面中消失)执行清理工作(比如:清理定时器等)

③ 参考代码

import { Component } from 'react'class Child extends Component {componentWillUnmount () {console.log('componentWillUnmount执行')}render() {return <h1>统计豆豆被打的次数:{this.props.count}</h1>}
}export default class App extends Component {state = {count: 0}handleClick = () => {this.setState({count: this.state.count + 1})}render() {return (<div>{ this.state.count < 5 && <Child count={this.state.count} />}<button onClick={this.handleClick}>打豆豆</button></div>)}
}

总结:

  • 组件卸载阶段执行 componentWillUnmount, 可以清理全局事件、定时器等。

5. setState扩展-发现问题

发现setState是“异步”的,多次setState会合并。

大致步骤:

  • 理解setState是“异步”的,理解setState会合并更新
  • React这么处理的好处是什么?

具体内容:

  1. 理解setState是“异步”的,理解setState会合并更新
    • 调用 setState 时,将要更新的状态对象,放到一个更新队列中暂存起来(没有立即更新)
    • 如果多次调用 setState 更新状态,状态会进行合并,后面覆盖前面
    • 等到所有的操作都执行完毕,React 会拿到最终的状态,然后触发组件更新
  2. React这么处理的好处是什么?
    • “异步” 更新,或者做延时更新,为了等所有操作结束后去更新
    • 合并更新,是将多次setState合并,然后进行更新
    • 都是为了提高渲染性能
import React, {Component} from 'react' 
export default class Demo extends Component {state = {count: 0}handleClick = () => {this.setState({count: this.state.count+100})this.setState({count: this.state.count+1})console.log(this.state.count)  // 打印0}render() {console.log('render')return (<div><div>Demo组件:{this.state.count}</div><button onClick={this.handleClick}>体现“异步”和合并</button> </div>)}
}

总结:

  • setState函数具有 “异步” 和 合并 的特点,目的为了提高渲染性能。

6. setState扩展-更多用法

掌握setState的更多用法,让数据串联更新,等待数据页面更新。

大致步骤:

  • 多次使用setState让数据串联使用的写法
  • 调用setState后页面更新后执行逻辑写法

具体内容:

① 多次使用setState让数据串联使用的写法

import React, {Component} from 'react' 
export default class Demo extends Component {state = {count: 0}handleClick = () => {// this.setState({count: this.state.count+1})// this.setState({count: this.state.count+1})// this.setState({count: this.state.count+1})// 页面展示 1this.setState(prevState=>{return {count: prevState.count + 1}})this.setState(prevState=>{return {count: prevState.count + 1}})this.setState(prevState=>{return {count: prevState.count + 1}})// 页面展示 3}render() {return (<div><div>Demo组件:{this.state.count}</div><button onClick={this.handleClick}>setState串联更新数据</button> </div>)}
}

② 调用setState后页面更新后执行逻辑写法

import React, {Component} from 'react' 
export default class Demo extends Component {state = {count: 0}handleClick = () => {this.setState(prevState=>{return {count: prevState.count + 1}},()=>{console.log('更新后:', this.state.count)  // 打印:1})console.log('未更新:', this.state.count)  // 打印:0}render() {return (<div><div>Demo组件:{this.state.count}</div><button onClick={this.handleClick}>setState更新后执行逻辑</button> </div>)}
}

总结:

  • 使用 setState((prevState) => {}) 语法,可以解决多次调用状态依赖问题
  • 使用 setState(updater[, callback]) 语法,在状态更新(页面完成重新渲染)后立即执行某个操作

 7. setState扩展-异步

能够说出setState到底是同步的还是异步

大致步骤:

  • 了解为啥会出现“异步”现象

具体内容:

  • setState本身并不是一个异步方法,其之所以会表现出一种“异步”的形式,是因为react框架本身的一个性能优化机制
  • React会将多个setState的调用合并为一个来执行,也就是说,当执行setState的时候,state中的数据并不会马上更新
import React, { Component } from 'react';
import ReactDOM from 'react-dom'class App extends Component {state = {count: 0,monney: 10}render() { return (<div><h1>我是app根组件------------{ this.state.count }---------{ this.state.monney}</h1><button onClick={this.addCount}> + 1</button></div>)}addCount = () => {this.setState({count: this.state.count + 1})this.setState({count: this.state.count + 1})this.setState({monney: this.state.monney + 11})this.setState({count: this.state.count + 2})// 多次调用了 setState 方法, 相当于只执行了一次// this.setState({//   count: this.state.count + 2,//   monney: this.state.monney + 11// })console.log(this.state.count)}
}ReactDOM.render(<App></App>, document.querySelector('#root'))

总结:

  • 在react类组件中,多次的setState并不会立刻执行,而是合并成一个来执行。

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

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

相关文章

Python3自带HTTP服务:轻松开启与后台管理

Python3自带有http服务&#xff0c;可以在服务器&#xff0c;也可以在本地启动&#xff0c;并运行一些常用的网页程序。比如&#xff1a;我们可以把streamlit框架编写的网页放到服务器上&#xff0c;开启http服务&#xff0c;就可以通过网页来调用这个pythont程序了&#xff0c…

Java SE 总结

Java SE&#xff08;Standard Edition&#xff09;是Java编程语言的标准版本&#xff0c;提供了基础的编程环境和API&#xff0c;适用于开发和运行Java应用程序。下面是Java SE的几个重要方面的知识回顾与总结。 1. Java环境基础 具体可参考这里对三者的介绍 传送门 1.1 JVM…

C++【类和对象】(取地址运算符重载与实现Date类)

文章目录 取地址运算符重载const成员函数取地址运算符重载 Date类的实现Date.hDate.cpp1.检查日期合法性2. 构造函数/赋值运算符重载3.得到某月的天数4. Date类 - 天数的操作4.1 日期 天数4.2 日期 天数4.3 日期 - 天数4.4 日期 - 天数 5. Date的前后置/--5.1 前置5.2 后置5.…

ORM的了解

什么是ORM&#xff1f;为什么要用ORM&#xff1f;-CSDN博客 C高级编程&#xff08;99&#xff09;面向资源的设计思想&#xff08;ORM&#xff09;_c orm-CSDN博客 ORM:Object-Relational-Mapping 对象关系映射 -------------------------- 我想对数据库中的表A进行增删改…

天龙八部怀旧单机微改人面桃花+安装教程+GM工具+虚拟机一键端

今天给大家带来一款单机游戏的架设&#xff1a;天龙八部怀旧单机微改人面桃花。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xf…

【Mybatis篇】动态SQL的详细带练

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 文章目录 &#x1f3af;一.动态SQL简单介绍 &#x1f6a6;动态S…

【深度】为GPT-5而生的「草莓」模型!从快思考—慢思考到Self-play RL的强化学习框架

原创 超 超的闲思世界 2024年09月11日 19:17 北京 9月11日消息&#xff0c;据外媒The Information昨晚报道&#xff0c;OpenAI的新模型「草莓」&#xff08;Strawberry&#xff09;&#xff0c;将在未来两周内作为ChatGPT服务的一部分发布。 「草莓」项目是OpenAI盛传已久的…

全网最全软件测试面试题(含答案解析+文档)

一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计&#xff0c;到开发成功投入使用&#xff0c;并在使用中不断地修改、增补和完善&#xff0c;直到停止该软件的使用的全过程(从酝酿到…

YOLO V8半自动标注工具设计

前提&#xff1a; 对于某些边界不明确的小目标&#xff0c;要是目标由比较多的话&#xff0c;标注起来就会非常麻烦。 如何利用已有训练模型&#xff0c;生成框&#xff0c;进行预标注。再通过调节预标注框的方式&#xff0c;提高标注的效率。 1 通过预先训练的模型生成yolo 格…

一文上手SpringSecurity【七】

之前我们在测试的时候,都是使用的字符串充当用户名称和密码,本篇将其换成MySQL数据库. 一、替换为真实的MySQL 1.1 引入依赖 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</v…

Jenkins Pipeline 中通过勾选参数来控制是否构建 Docker 镜像

1.定义参数&#xff1a; 使用 booleanParam 定义一个布尔参数&#xff0c;示例如下 booleanParam(name: BUILD_DOCKER, description: 是否构建Docker镜像, defaultValue: false)2.使用参数&#xff1a; 在 stage 中&#xff0c;根据参数的值决定构建方式&#xff1a; stage(编…

python基础库

文章目录 1.研究目的2.platform库介绍3.代码4.结果展示 1.研究目的 最近项目中需要利用python获取计算机硬件的一些基本信息,查阅资料,.于是写下这篇简短的博客,有问题烦请提出,谢谢-_- 2.platform库介绍 platform 库是 Python 的一个内置库&#xff0c;可以让我们轻松地获取…

spring boot 项目中redis的使用,key=value值 如何用命令行来查询并设置值。

1、有一个老项目&#xff0c;用到了网易云信&#xff0c;然后这里面有一个AppKey&#xff0c;然后调用的时候要在header中加入这些标识&#xff0c;进行与服务器进行交互。 2、开发将其存在了redis中&#xff0c;一开始的时候&#xff0c;我们测试用的老的key&#xff0c;然后提…

ValueError: Out of range float values are not JSON compliant

可能原因一 可能原因二 数据里面有NaN

算法: 滑动窗口题目练习

文章目录 滑动窗口长度最小的子数组无重复字符的最长子串最大连续1个个数 III将x减到0的最小操作数水果成篮找到字符串中所有字母异位词串联所有单词的子串最小覆盖子串 总结 滑动窗口 长度最小的子数组 做这道题时,脑子里大概有个印象,知道要用滑动窗口,但是对于滑动窗口为什…

2016年国赛高教杯数学建模D题风电场运行状况分析及优化解题全过程文档及程序

2016年国赛高教杯数学建模 D题风电场运行状况分析及优化 风能是一种最具活力的可再生能源&#xff0c;风力发电是风能最主要的应用形式。我国某风电场已先后进行了一、二期建设&#xff0c;现有风机124台&#xff0c;总装机容量约20万千瓦。请建立数学模型&#xff0c;解决以下…

探索私有化聊天软件:即时通讯与音视频技术的结合

在数字化转型的浪潮中&#xff0c;企业对于高效、安全、定制化的通讯解决方案的需求日益迫切。鲸信&#xff0c;作为音视频通信技术的佼佼者&#xff0c;凭借其强大的即时通讯与音视频SDK&#xff08;软件开发工具包&#xff09;结合能力&#xff0c;为企业量身打造了私有化聊天…

MySQL Mail服务器集成:如何配置发送邮件?

MySQL Mail插件使用指南&#xff1f;怎么优化 MySQL发邮件性能&#xff1f; MySQL Mail服务器的集成&#xff0c;使得数据库可以直接触发邮件发送&#xff0c;极大地简化了应用架构。AokSend将详细介绍如何配置MySQL Mail服务器&#xff0c;以实现邮件发送功能。 MySQL Mail&…

【YashanDB知识库】如何配置jdbc驱动使getDatabaseProductName()返回Oracle

本文转自YashanDB官网&#xff0c;具体内容请见https://www.yashandb.com/newsinfo/7352676.html?templateId1718516 问题现象 某些三方件&#xff0c;例如 工作流引擎activiti&#xff0c;暂未适配yashandb&#xff0c;使用中会出现如下异常&#xff1a; 问题的风险及影响 …

【STM32】江科大STM32笔记汇总(已完结)

STM32江科大笔记汇总 STM32学习笔记课程简介(01)STM32简介(02)软件安装(03)新建工程(04)GPIO输出(05)LED闪烁& LED流水灯& 蜂鸣器(06)GPIO输入(07)按键控制LED 光敏传感器控制蜂鸣器(08)OLED调试工具(09)OLED显示屏(10)EXTI外部中断(11)对射式红外传感器计次 旋转编码器…