React类组件生命周期与this关键字

类组件生命周期

参考链接
一图胜千言(不常用的生命周期函数已隐藏)
在这里插入图片描述
代码:

//CC1.js
import { Component } from "react";export default class CC1 extends Component {constructor(props) {super(props);console.log("construtor");this.state = {count: 0,};}componentDidMount() {console.log("component Did Mount");}componentDidUpdate() {console.log("component Did Update");}increaseCount() {console.log("this:", this);this.setState((preState) => ({count: preState.count + 1,})); }componentWillUnmount() {console.error("unmount");}render() {console.log("render");let { count } = this.state;return (<><div>类组件一</div><p>{count}</p><div><button onClick={this.increaseCount}>count+1</button></div></>);}
}
组件挂载

  组件初次挂载时,先执行构造方法中的内容,接着是render方法,最后是componentDidMount钩子;(通过打印语句可验证)

组件更新

问题:当我们点击按钮更新count时,会发现控制台报错,并没有成功使得count+1。这是因为在函数increaseCount中,this的指向丢失了。
解决问题:
(1)在构造方法中通过bind方法绑定this指向;

constructor(props) {super(props);console.log("construtor");this.state = {count: 0,};this.increaseCount = this.increaseCount.bind(this);
}

(2)将increaseCount方法改成箭头函数的形式;
参考链接

increaseCount = () => {console.log("this:", this);this.setState((preState) => ({count: preState.count + 1,}));};

(3)在调用increaseCount方法的时候使用bind函数绑定this指向:

<div><button onClick={this.increaseCount.bind(this)}>count+1</button>
</div>

  上述三种方法解决了this指向的丢失问题。
  当我们再点击按钮就可以更新count的状态了,此时组件中函数的执行顺序是,render =》componentDidUpdate。

组件卸载

  在根组件中引入类组件,模拟组件的卸载;
代码:

//App.jsx
import { useState } from "react";
import CC1 from "./CC1";
function App() {const [flag, setFlag] = useState(true);return (<><div><div>App</div><div>{flag ? <CC1 /> : ""}</div><button onClick={() => setFlag(!flag)}>destory/load</button></div></>);
}export default App;

点击按钮可模拟类组件CC1的卸载,此时函数componentWillUnmount中的代码会执行。

函数式组件

  现在官方已经推崇函数式组件,因为其比类组件简化了很多,没有烦人的this指向和那么多的生命周期函数。通过很多hooks也可以模拟组件的生命周期。
  类组件上述的众多生命周期函数,在函数式组件中只需要一个useEffect hook就可以达到一样的效果,并且代码量大大减少。
代码:

import { useEffect, useState } from "react";export default function Fc() {const [count, setCount] = useState(0);useEffect(() => {console.log("count更新了");return () => {console.log("preCount", count);};}, [count]);const increaseCount = () => {setCount(count + 1);};return (<div><div>Fc</div><p>{count}</p><button onClick={increaseCount}>count+1</button></div>);
}

解释:
  useEffect钩子函数又称清理副作用的函数。
  上述的useEffect的依赖项为[count],说明函数主体内的内容会在组件初次挂载时,以及count更新时会执行,相当于类组件中的componentDidMount函数和componentDidUpdate函数。
  useEffect钩子可以返回一个函数,又称为清理函数(例如可以清理定时器等等)。这个清理函数中的代码,会在组件更新时,以及组件卸载时执行,在其中可以拿到组件更新之前或者卸载之前的状态。模拟了类组件中的componentWillUnmount函数和带参数的componentDidUpdate(可以获取上次的状态)

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

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

相关文章

人工智能算法工程师(高级)课程8-图像分割项目之Mask-RCNN模型的介绍与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(高级)课程8-图像分割项目之Mask-RCNN模型的介绍与代码详解。Mask R-CNN模型是一种广泛应用于目标检测和实例分割的任务的深度学习框架。本文将详细介绍Mask R-CNN的原理,包括Box Regression、Classification和Mask …

追问试面试系列:开篇

我们不管做任何事情&#xff0c;都是需要个理由&#xff0c;而不是盲目去做。 为什么写这个专栏&#xff1f; 就像我们被面试八股文时&#xff0c;市面上有很多面试八股文&#xff0c;随便一个八股文都是500&#xff0c;甚至1000面试题。诸多面试题&#xff0c;难道我们需要一…

Node Js开发环境的搭建

前言 通过自动化繁琐的设置和配置工作&#xff0c;帮助开发者快速启动新项目。常见的Node脚手架工具包括Yeoman、Express Generator、Create React App等。 一、什么是脚手架 1、什么是脚手架&#xff1f; 脚手架在软件开发中指的是一种自动化工具或脚本&#xff0c;用于快速创…

谷粒商城实战笔记-72-商品服务-API-属性分组-获取分类属性分组

文章目录 一&#xff0c;后端接口开发Controller层修改接口接口测试 二&#xff0c;前端开发 这一节的内容是开发获取分类属性分组的接口。 一&#xff0c;后端接口开发 Controller层修改接口 修改AttrGroupController接口。 RequestMapping("/list/{catelogId}")p…

【算法/训练】:动态规划(线性DP)

一、路径类 1. 字母收集 思路&#xff1a; 1、预处理 对输入的字符矩阵我们按照要求将其转换为数字分数&#xff0c;由于只能往下和往右走&#xff0c;因此走到&#xff08;i&#xff0c;j&#xff09;的位置要就是从&#xff08;i - 1&#xff0c; j&#xff09;往下走&#…

【Go系列】Go的UI框架Fyne

前言 总有人说Go语言是一门后端编程语言。 Go虽然能够很好地处理后端开发&#xff0c;但是者不代表它没有UI库&#xff0c;不能做GUI&#xff0c;我们一起来看看Go怎么来画UI吧。 正文 Go语言由于其简洁的语法、高效的性能和跨平台的编译能力&#xff0c;非常适合用于开发GUI…

鸿蒙应用框架开发【dlopen加载so库并获取Rawfile资源】 NDK

dlopen加载so库并获取Rawfile资源 介绍 本示例中主要介绍在TaskPool子线程中使用dlopen加载so库&#xff0c;以及如何使用Native Rawfile接口操作Rawfile目录和文件。功能包括文件列表遍历、文件打开、搜索、读取和关闭Rawfile。 效果预览 使用说明 应用界面中展示了Rawfil…

2024最新Uniapp的H5网页版添加谷歌授权验证

现在教程不少&#xff0c;但是自从谷歌升级验证之后&#xff0c;以前的老教程就失效了&#xff0c;现在写一个新教程以备不时之需。 由于众所周知的特殊原因&#xff0c;开发的时候一定注意网络环境&#xff0c;如果没有梯子是无法进行开发的哦~ clientID的申请方式我就不再进…

昇思MindSpore 应用学习-DCGAN生成漫画头像-CSDN

日期 心得 昇思MindSpore 应用学习-DCGAN生成漫画头像&#xff08;AI代码学习&#xff09; DCGAN生成漫画头像 在下面的教程中&#xff0c;我们将通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。在本教程中&#xff0c;使用的动…

数据结构:二叉树(堆)的顺序存储

文章目录 1. 树1.1 树的概念和结构1.2 树的相关术语 2. 二叉树2.1 二叉树的概念和结构2.2 二叉树的特点2.3 特殊的二叉树2.3.1 满二叉树2.3.2 完全二叉树 2.4 二叉树的性质 3. 实现顺序结构二叉树3.1 堆的概念和结构3.2 初始化3.3 销毁3.4 插入数据3.5 向上调整算法3.6 删除数据…

如何查找下载安装安卓APK历史版本?

在安卓设备上&#xff0c;有时候我们可能希望安装某个软件的旧版本&#xff0c;可能是因为新版本不兼容、功能改变不符合需求或是其他原因。 安卓系统并不像iOS那样提供直观的历史版本下载界面。 不过&#xff0c;通过一些第三方市场和网站&#xff0c;我们仍然可以找到并安装…

【LLM】-08-搭建问答系统-语言模型,提问范式与 Token

目录 1、语言模型 1.1、训练过程&#xff1a; 1..2、大型语言模型分类&#xff1a; 1.3、指令微调模型训练过程&#xff1a; 2、Tokens 3、Helper function辅助函数 (提问范式) 4、计算token数量 1、语言模型 大语言模型&#xff08;LLM&#xff09;是通过预测下一个词…

【python】sklearn基础教程及示例

【python】sklearn基础教程及示例 Scikit-learn&#xff08;简称sklearn&#xff09;是一个非常流行的Python机器学习库&#xff0c;提供了许多常用的机器学习算法和工具。以下是一个基础教程的概述&#xff1a; 1. 安装scikit-learn 首先&#xff0c;确保你已经安装了Python和…

搜索引擎项目(四)

SearchEngine 王宇璇/submit - 码云 - 开源中国 (gitee.com) 基于Servlet完成前后端交互 WebServlet("/searcher") public class DocSearcherServlet extends HttpServlet {private static DocSearcher docSearcher new DocSearcher();private ObjectMapper obje…

Kettle下载安装

环境说明 虚拟机&#xff1a;Win7&#xff1b;MySql8.0 主机&#xff1a;Win11&#xff1b;JDK1.8&#xff1b;Kettle 9.4&#xff08;Pentaho Data Integration 9.4&#xff09;&#xff08;下载方式见文末&#xff09; 安装说明 【1】解压后运行Spoon.bat 【2】将jar包 复…

【Linux C | 网络编程】进程池退出的实现详解(五)

上一篇中讲解了在进程池文件传输的过程如何实现零拷贝&#xff0c;具体的方法包括使用mmap&#xff0c;sendfile&#xff0c;splice等等。 【Linux C | 网络编程】进程池零拷贝传输的实现详解&#xff08;四&#xff09; 这篇内容主要讲解进程池如何退出。 1.进程池的简单退…

聊聊基于Alink库的主成分分析(PCA)

概述 主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#xff09;是一种常用的数据降维和特征提取技术&#xff0c;用于将高维数据转换为低维的特征空间。其目标是通过线性变换将原始特征转化为一组新的互相无关的变量&#xff0c;这些新变量称为主成分&…

7月24日JavaSE学习笔记

序列化版本控制 序列化&#xff1a;将内存对象转换成序列&#xff08;流&#xff09;的过程 反序列化&#xff1a;将对象序列读入程序&#xff0c;转换成对象的方式&#xff1b;反序列化的对象是一个新的对象。 serialVersionUID 是一个类的序列化版本号 private static fin…

算法通关:006_1二分查找

二分查找 查找一个数组里面是否存在num主要代码运行结果 详细写法自动生成数组和num&#xff0c;利用对数器查看二分代码是否正确 查找一个数组里面是否存在num 主要代码 /*** Author: ggdpzhk* CreateTime: 2024-07-27*/ public class cg {//二分查找public static boolean …