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.rhkb.cn/news/434084.html

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

相关文章

CentOS 修改服务器登录密码的完整指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

【Linux】ubuntu 16.04 搭建jdk 11 环境(亲测可用)

目录 0.环境 1.题外话 2.详细 0.环境 windows11 主机 Virtual Box 7.0 ubuntu 16.04系统 想搭建个 jdk11的环境&#xff0c;用于项目 1.题外话 因为虚拟机与主机传输文件不方便&#xff0c;所以可以尝试用共享文件夹的方式传输&#xff0c;亲测可用&#xff0c;参考以下博…

2024-09-27 buildroot C和语言将 中文的GBK编码转换为 UTF-8 的代码, printf 显示出来,使用 iconv 库去实现。

一、GBK 的英文全称是 "Guobiao Kuozhan"&#xff0c;意为 "National Standard Extended"。它是对 GB2312 编码的扩展&#xff0c;用于表示更多汉字和符号 GBK&#xff08;国标扩展汉字编码&#xff09;是一种用于简体中文和繁体中文字符的编码方式&#x…

ROSTCM6+Gephi的网络语义分析详细教程(附案例实战)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

前端练习总结(1)

前端实习练习题 前端实习笔试题0920 visibility:hidden display:none把鼠标移到按钮并点击时 hover active focus的顺序代码输出结果1代码输出结果2CSS中哪些属性可以继承cookie sessionStorage localstorage区别面向对象基本特征有哪些,请具体说明下列关于v-model的说法,哪项…

数据结构 ——— 顺序表oj题:编写函数,合并两个有序数组

目录 题目要求 代码实现 题目要求 nums1 和 nums2 是两个升序的整型数组&#xff0c;另外有两个整数 m 和 n 分别代表 nums1 和 nums2 中的元素个数 要求合并 nusm2 到nums1 中&#xff0c;使合并后的 nums1 同样按升序顺序排列 最终&#xff0c;合并后的数组不应由函数返…

CSS05-复合选择器

一、什么是复合选择器 1-1、后代选择器&#xff08;重要&#xff09; 示例1&#xff1a; 示例2&#xff1a; 示例3&#xff1a; 1-2、子选择器 示例&#xff1a; 1-3、并集选择器&#xff08;重要&#xff09; 示例&#xff1a; 1-4、伪类选择器 1、链接伪类选择器 注意事项&am…

【SpringCloud】服务注册/服务发现-Eureka

服务注册/服务发现-Eureka 1. 背景1.1 问题描述1.2 解决思路1.3 什么是注册中⼼1.4 CAP理论1.5 常⻅的注册中⼼ 2. Eureka 介绍3. 搭建Eureka Server 1. 背景 1.1 问题描述 上个章节的例⼦中可以看到, 远程调⽤时, 我们的URL是写死的 String url "http://127.0.0.1:90…

本地部署开源在线PPT制作与演示应用PPTist并实现异地远程使用

文章目录 前言1. 本地安装PPTist2. PPTist 使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows系统环境本地部署开源在线演示文稿应用PPTist&#xff0c;并结合cpolar内网穿透工具实现随时随地远程访问与使用该项目。 PPTist …

ST188单光束反射式红外光电传感器心率测量原理

光电传感器心率测量原理 ST188传感器测量脉搏的具体原理如下&#xff1a; 当手指轻轻按压在ST188红外光电传感器上时&#xff0c;传感器内部的红外发射二极管会发出红外线。这些红外线穿透手指皮肤&#xff0c;照射到血液上。由于脉搏跳动时&#xff0c;血液的体积和压力会发生…

从零开始,Docker进阶之路(三):Docker镜像与命令

一、Docker核心名词 镜像文件、容器、仓库 镜像&#xff1a;简单理解为就是一个安装包&#xff0c;里面包含容器所需要运行的基础文件和配置信息&#xff0c;比如&#xff1a;redis镜像、mysql镜像等。 镜像的来源方式&#xff1a; 1.自己做镜像&#xff0c;比如自己开发微服…

K8s容器运行时,移除Dockershim后存在哪些疑惑?

K8s容器运行时&#xff0c;移除Dockershim后存在哪些疑惑&#xff1f; 大家好&#xff0c;我是秋意零。 K8s版本截止目前&#xff08;24/09&#xff09;已经发布到了1.31.x版本。早在K8s版本从1.24.x起&#xff08;22/05&#xff09;&#xff0c;默认的容器运行时就不再是Doc…

记录Mac编译Android源码踩过的坑

学习Android源码&#xff0c;如果电脑配置还不错&#xff0c;最好还是下载一套源码&#xff0c;经过编译后导入到Android Studio中来学习&#xff0c;这样会更加的直观&#xff0c;代码之间的跳转查看会更加方便。因此&#xff0c;笔者决定下载并编译一套源码&#xff0c;以利于…

生活中重大决定,除了你自己,谁也帮不了你!

随着年龄增长&#xff0c;越来越发现&#xff1a;生活是非常现实&#xff0c;更现实的社会&#xff0c;自己除了自己&#xff0c;谁也帮不了你。 因此&#xff0c;一个人的生活是好是坏&#xff0c;往往取决于我们自己的努力程度&#xff0c;越努力才会越幸运。没有伞的孩子&am…

力扣(leetcode)每日一题 2516 每种字符至少取 K 个 | 滑动窗口

2516. 每种字符至少取 K 个 给你一个由字符 a、b、c 组成的字符串 s 和一个非负整数 k 。每分钟&#xff0c;你可以选择取走 s 最左侧 还是 最右侧 的那个字符。 你必须取走每种字符 至少 k 个&#xff0c;返回需要的 最少 分钟数&#xff1b;如果无法取到&#xff0c;则返回…

Win10系统插入带有麦克风的耳机_麦克风不起作用_解决方法_亲测成功---Windows运维工作笔记054

今天我在使用讯飞输入法的时候,想通过讯飞的语音输入法来提高自己的输入效率。 但是这个时候发现一个问题就是我插入我的台式机的是一个带有麦克风的耳机。 但是发现我这个耳机没有办法被电脑识别出麦克风来,所以说就没办法使用讯飞输入法的语音输入功能来直接输入文字了。…

你知道AI模型是如何学习的吗???零基础入门到精通,收藏这一篇就够了

在人工智能的广阔天地中&#xff0c;AI模型的学习方式不仅决定了其智能行为的深度和广度&#xff0c;更是推动技术进步和应用创新的关键动力。随着AI技术的飞速发展&#xff0c;我们越来越意识到&#xff0c;深入了解AI的学习机制对于把握其潜能至关重要。 这篇文章将从基础概…

从物流员到月薪12K:他如何成功转行人工智能大模型,逆袭人生!

苑同学&#xff0c;21岁&#xff0c;江苏人 专科学历&#xff0c;物流管理专业 入行后&#xff1a;嵌入式开发&#xff0c;12K 工作地点&#xff1a;苏州 苑同学&#xff0c;来自江苏苏州&#xff0c;是一名普通的大专毕业生&#xff0c;今天我们来听听他的故事。。。 我的…

蓝桥杯—STM32G431RBT6(TIM定时器输入捕获频率和占空比)

一、什么是输入捕获&#xff1f;对比输出捕获区别&#xff1f; 输入捕获是指对输入信号的特定事件进行检测和记录它主要用于测量输入信号的时间间隔、频率等参数。而输出捕获则是对输出信号的特定事件进行控制和监测。两者的主要区别在于作用对象不同&#xff0c;输入捕获关注的…

【Threejs进阶教程-着色器篇】8. Shadertoy如何使用到Threejs-基础版

【Threejs进阶教程-着色器篇】8. Shadertoy如何使用到Threejs - 基础版 前七篇地址,建议按顺序学习致谢带我入门的[X01动力装甲]大佬本文适用范围怎么样在Shadertoy中画出正圆形shadertoy中的坐标系比例转换理解Shadertoy的fragCoord理解Shadertoy中的iResolution 转移Shaderto…