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

news2024/11/10 23:09:24

类组件生命周期

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

//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.coloradmin.cn/o/1957203.html

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

相关文章

基于IDEA+Mysql+SpringBoot开发的社区养老服务管理系统

基于IDEAMysqlSpringBoot开发的社区养老服务管理系统 项目介绍&#x1f481;&#x1f3fb; node -version 14.21.3 在当前社会老龄化趋势日益加剧的背景下&#xff0c;构建一个高效、便捷的社区网养老服务管理系统显得尤为重要。本项目基于Spring Boot框架开发&#xff0c;旨…

网站打不开怎么办,收藏以备不时之需

DNS设置示范教程 部分地区有使用移动网络的小伙伴们吐槽无法访问部分网站的情况&#xff0c;同样的网站&#xff0c;使用电信和联通的用户就能正常访问。 这其实有很大几率是由于运营商的网络问题导致的&#xff0c;容易出现网站打不开的结果。 要解决移动网络无法访问的情况…

【React Hooks原理 - useTransition】

概述 在上一篇中我们介绍了useDeferredValue的基本原理&#xff0c;本文主要介绍一下useTransition这个Hook&#xff0c;之所以在这里提到useDeferredValue&#xff0c;是因为这两个Hook都是在React18引入的进行渲染优化的Hooks&#xff0c;在某些功能上是重叠的&#xff0c;主…

YOLO入门教程(一)——训练自己的模型【含教程源码 + 故障排查】

目录 引言前期准备Step1 打标训练Step2 格式转换Step3 整理训练集Step4 训练数据集4.1创建yaml文件4.2训练4.3故障排查4.3.1OpenCV版本故障&#xff0c;把OpenCV版本升级到4.0以上4.3.2NumPy版本故障&#xff0c;把NumPy降低版本到1.26.44.3.3没有安装ultralytics模块4.3.4Aria…

自闭症儿童上学指南:帮助孩子适应校园生活

在自闭症儿童成长的道路上&#xff0c;校园生活是他们融入社会、学习新知、发展社交技能的重要一步。作为星启帆自闭症儿童康复机构&#xff0c;我们深知这一过程对于孩子及其家庭而言既充满挑战也极具意义。 一、前期准备&#xff1a;建立坚实的支持体系 1. 深入了解孩子需求 …

【机器学习】梯度下降函数如何判断其收敛、学习率的调整以及特征缩放的Z-分数标准化

#引言 在机器学习中&#xff0c;特征缩放和学习率是两个非常重要的概念&#xff0c;它们对模型的性能和训练速度有显著影响。 特征缩放是指将数据集中的特征值缩放到一个固定的范围内&#xff0c;通常是在0到1之间或者标准化到均值为0、方差为1。特征缩放对于模型的训练至关重要…

Vmware安装openstack

安装虚拟机 创建完成后&#xff0c;点击开启虚拟机 稍等执行成功后 上传压缩包到指定目录。将yoga_patch.tar.gz包上传至/root目录下&#xff0c;将stack3_without_data.tar.gz包使用WinSCP上传至/opt目录下 vim run_yoga.sh #/bin/bash cd /root sudo apt-get update tar -xzv…

java面向对象总结

java面向对象篇到这里就已经结束了&#xff0c;有什么不懂的地方可以逐一进行重新观看。希望大家能够从入门到起飞。 Java面向对象基础篇综合训练&#xff08;附带全套源代码及逐语句分析&#xff09;-&#xff1e;基于javabeen Java面向对象进阶篇综合训练&#xff08;附带全…

如何跨专业通过软件设计师考试

链接&#xff1a;如何跨专业通过软件设计师-软件中级职称考试 (qq.com)

经济下行,企业还在“裁员至上”?

最近小红书、B站崩溃&#xff0c;又延伸到某云服务厂商问题频发&#xff0c;让人忍不住戏谑&#xff1a;“这算不算裁员裁到大动脉&#xff1f;” 在阿道看来&#xff0c;各大企业的裁员动作&#xff0c;绕不开的依旧是“人月神话”&#xff1a;盲目加人带来的是成本的倍增和效…

STKMATLAB 卫星编队覆盖分析纯代码实现

任务描述 设置卫星编队&#xff08;沿航迹编队&#xff0c;大斜视角&#xff0c;幅宽100km&#xff0c;下视角30&#xff0c;斜视角26&#xff09;&#xff0c;设置分析区域&#xff08;中国全境&#xff09;&#xff0c;设置FigureOfMerit&#xff08;展示覆盖率&#xff09;…

skynet 入门篇

文章目录 概述1.实现了actor模型2.实现了服务器的基础组件 环境准备centosubuntumac编译安装 ActorActor模型定义组成 Actor调度工作线程流程工作线程权重工作线程执行规则 小结 概述 skynet 是一个轻量级服务器框架&#xff0c;而不仅仅用于游戏&#xff1b; 轻量级有以下几…

16现代循环神经网络—深度循环与双向循环

目录 1.深度循环神经网络回顾:循环神经网络总结简洁代码实现2.双向循环神经网络隐马尔可夫模型中的动态规划双向模型模型的计算代价及其应用总结代码实现1.深度循环神经网络 回顾:循环神经网络 如何将循环神经网络变深,以获得更多的非线性? 通过添加多个隐藏层的方式来实现…

Transformer中的Multi-head与Self-Attention机制解析——从单一关注到多元自省的效益最大化

Transformer中的Multi-head与Self-Attention机制解析——从单一关注到多元自省的效益最大化 Multi-head Attention与Self-Attention的核心思想 想象一下&#xff0c;你在读一本书&#xff0c;你想要同时关注到书中的多个角色和情节。多头注意力机制就是让你能够同时关注到多个不…

day14:01函数参数的使用

一、形参与实参介绍 【形参】&#xff1a;在定义函数阶段定义的参数称之为形式参数&#xff0c;简称形参,相当于变量名 def func(x, y): # x1&#xff0c;y2print(x, y)【实参】&#xff1a;在调用函数阶段传入的值称之为实际参数&#xff0c;简称实参&#xff0c;相当于变量…

OpenEuler系统下——k8s离线安装部署

简介 K8S是目前已经是业界最为流行的开源技术框架&#xff0c;但是苦于其学习难度较大&#xff0c;并且初学者在开始的时候需要自己进行安装搭建部署&#xff0c;以供后续的学习使用&#xff0c;但是国内经常会出现无法访问外网的官方网站&#xff0c;导致很多镜像和依赖包无法…

uCore2020 lab1练习一作业

在线环境&#xff08;无需搭建环境即可复现&#xff09; 在线实验指导书uCore2020&#xff0c;有些章节无法访问 文章目录 lab1练习一1、操作系统镜像文件ucore.img生成过程init.o等文件的生成过程bin/kernal的生成过程bin/sign的生成过程bin/bootblock的生成过程bin/ucore.i…

搭建AI无人直播插件

在当今的数字时代&#xff0c;直播已成为一种极为流行的内容传播方式&#xff0c;而人工智能(AI)技术的飞速发展更是为直播行业注入了新的活力。 AI无人直播插件&#xff0c;作为这一趋势下的产物&#xff0c;不仅能够实现24小时不间断的直播内容生成&#xff0c;还能根据观众…

SpringCloud Alibaba 微服务(四):Sentinel

目录 前言 一、什么是Sentinel&#xff1f; Sentinel 的主要特性 Sentinel 的开源生态 二、Sentinel的核心功能 三、Sentinel 的主要优势与特性 1、丰富的流控规则 2、完善的熔断降级机制 3、实时监控和控制台 4、多数据源支持 5、扩展性强 四、Sentinel 与 Hystrix…

Redis 序列化 GenericJackson2JsonRedisSerializer和Jackson2JsonRedisSerializer的区别

GenericJackson2JsonRedisSerializer 和 Jackson2JsonRedisSerializer 是 Spring Data Redis 提供的两种基于 Jackson 的 Redis 序列化器。 它们的主要区别在于序列化和反序列化的方式以及适用的场景。 GenericJackson2JsonRedisSerializer 序列化方式&#xff1a;在序列化对…