React Hooks生命周期

news2024/9/22 21:29:18

文章目录

  • 前言
  • 一、类组件的生命周期
    • 1、什么是类组件
    • 2、生命周期钩子
  • 二、函数组件生命周期
    • 1、什么是函数组件
    • 2、模拟类组件生命周期钩子
  • 三、为什么要使用生命周期
    • 1、我们能在钩子里面干什么
    • 2、PureComponent和React.memo区别
  • 总结


前言

最近在写react项目,所以一直想写函数组件和类组件生命周期相关的一些知识总结。
基础知识,仅用来复习,和巩固学习。


一、类组件的生命周期

1、什么是类组件

类组件是使用ES6中关键字class来定义。类组件具有特定的生命周期方法,可以在不同阶段执行一些操作。类组件中必须实现render()方法来描述组件界面,并且可以通过state属性来存储和管理组件的内部状态。
例如:

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      state1: 'This is a React class.'
    };
  }
  render() {
    return (
      <div>{state1}</div>
    );
  }
}

这就是一个最基本的react类组件。

2、生命周期钩子

  1. 定义:
    生命周期函数是react类组件在整个组件从创建到卸载各个阶段自动调用的钩子函数。
  2. 有哪些钩子及钩子的基本作用:
//挂载阶段:组件被创建并插入到DOM中
constructor():
组件初始化时调用,用于初始化state和绑定方法
static getDerivedStateFromProps():
在组件挂载前和更新前调用,用于更新state
render():
必须定义,创建虚拟DOM并返回JSX结构
componentDidMount():
组件挂载后调用,可以进行DOM操作和网络请求等异步操作
//更新阶段:组件的props或state发生改变时触发
static getDerivedStateFromProps():
在组件挂载前和更新前调用,用于更新state
shouldComponentUpdate():
在组件更新前调用,用于判断组件是否需要更新
render():
必须定义,创建虚拟DOM并返回JSX结构
getSnapshotBeforeUpdate():
在组件更新前调用,用于获取DOM快照(如滚动位置等)
componentDidUpdate():
在组件更新后调用,可以进行DOM操作和网络请求等异步操作
//卸载阶段:组件从DOM中移除
componentWillUnmount():
在组件卸载前调用,用于清理组件相关的资源

示例代码:

//App组件-由于太懒了就直接用函数组件写了
import React, { useState } from 'react'
import TestLifeCycle from './pages/testLifeCycle'

const App = () => {
  const [show, setShow] = useState(true)
  const unMountClick = () => {
    setShow(!show)
  }
  return (
    <div className="App">
      { show ? <TestLifeCycle/> : null }
      <button onClick={unMountClick}>卸载</button>
    </div>
  )
}
export default App

//TestLifeCycle组件
import React from "react";

class TestLifeCycle extends React.Component {
  constructor () {
    console.log('constructor---')
    super()
    this.state = {
      state1: 'This is a React class.'
    }
  }

  componentDidMount() {
    console.log('componentDidMount---')
  }
  //更新
  static getDerivedStateFromProps(props, state) {
    console.log('getDerivedStateFromProps---', props, state)
    return null
  }
  shouldComponentUpdate(nextProps, nextState) {
    console.log('shouldComponentUpdate---', nextProps, nextState)
    return true
  }

  getSnapshotBeforeUpdate(prevProps, prevState) {
    console.log('getSnapshotBeforeUpdate---', prevProps, prevState)
    return null
  }
  componentDidUpdate() {
    console.log('componentDidUpdate---')
  }
  //卸载
  componentWillUnmount() {
    console.log('componentWillUnmount---')
  }

  updateState = () => {
    this.setState({
      state1: 'This is a React class. updateState'
    })
  }

  render () {
    const { titleShow } = this.state
    console.log('render---')
    return (
      <>
        <div>{this.state.state1}</div>
        <button onClick={this.updateState}>更新</button>
      </>
    )
  }
}

export default TestLifeCycle

首次运行后可以看到控制台打印的内容是:
在这里插入图片描述
当点击更新按钮更新state的时候可以看到打印了这些
在这里插入图片描述
当我们点击卸载按钮的时候看到正常打印了卸载的钩子函数
在这里插入图片描述
可以看到钩子函数还是很多的,可以让我们在不同的阶段不同的钩子函数里面实现很多业务逻辑。

二、函数组件生命周期

1、什么是函数组件

函数组件是一种声明式方式定义组件的形式,使用function关键字来定义一个新的函数。函数组件被设计成无状态的,只以props作为输入并返回React元素作为输出。函数组件不需要实现类组件中的生命周期方法和state状态。
例如:

import React, { useState } from 'react'
import TestLifeCycle from './pages/testLifeCycle'

const App = () => {
  const [show, setShow] = useState(true)
  const unMountClick = () => {
    setShow(!show)
  }
  return (
    <div className="App">
      { show ? <TestLifeCycle/> : null }
      <button onClick={unMountClick}>卸载</button>
    </div>
  )
}
export default App

2、模拟类组件生命周期钩子

因为函数组件没有生命周期钩子函数,所以我们只能是做一个模拟
可以模拟最基本的三个阶段钩子

import { useEffect, useState } from 'react'
function TestLifeCycleHook() {
  const [state, setState] = useState('This is function Hook.')
  // 模拟 componentDidMount 方法
  useEffect(() => {
    console.log('模拟---componentDidMount---')
  }, []);
  // 模拟 componentDidUpdate 方法
  useEffect(() => {
    console.log('模拟---componentDidUpdate---', state);
  }, [state]);
  // 模拟 componentWillUnmount 方法
  useEffect(() => {
    return () => {
      console.log('模拟---componentWillUnmount---');
    };
  }, []);
  const updateState = () => {
    setState('This is function Hook. updateState')
  }
  return (
    <>
      <div>{state}</div>
      <button onClick={updateState}>更新state</button>
    </>
  )
}

export default TestLifeCycleHook

首次运行我们可以看到控制台
在这里插入图片描述
当点击更新和卸载按钮的时候
在这里插入图片描述

三、为什么要使用生命周期

1、我们能在钩子里面干什么

因为这些钩子函数会在组件不同的生命周期阶段自动调用,所以:

  1. 我们可以在我们想要的时候根据实际的业务逻辑实现一些特定的功能。例如:

constructor:设置状态(State)和绑定方法(bind methods)。
componentDidMount:从服务器获取数据,调用接口。
componentDidUpdate:根据 props 和 state 的变化更新数据。
componentWillUnmount:清理数据,或者清楚定时器等异步任务。
shouldComponentUpdate:是优化组件必备的一个函数,可以使用它内部传入的参数决定是否需要重新渲染组件dom。—但是这个函数我们也可以使用react提供的PureComponent。优化性能必备。
class TestLifeCycle extends PureComponent
getDerivedStateFromProps:该函数在组件每次 render 前调用,它可以根据 props 计算 state,并返回一个对象来更新 state,或者返回 null 来表示不需要更新 state。
getSnapshotBeforeUpdate:该函数在组件即将更新和重新渲染之前调用,它返回一个 snapshot(快照),这个快照会在 componentDidUpdate() 函数中作为第三个参数传入使用。在这个函数内部可以读取 DOM 中的值,然后通过返回一个对象将值传递到 componentDidUpdate() 函数中。

  1. 注意

自 React 16.3 版本以来,React 官方已经废弃了以下三个生命周期钩子函数:

componentWillMount()
componentWillReceiveProps(nextProps)
componentWillUpdate(nextProps, nextState)

替代方案:

constructor() 函数代替 componentWillMount()static getDerivedStateFromProps()componentDidUpdate() 来代替 componentWillReceiveProps()(PureComponent)shouldComponentUpdate() 或 React.memo() 取代 componentWillUpdate()

2、PureComponent和React.memo区别

(PureComponent)shouldComponentUpdate() 或 React.memo()区别

总结

有了函数组件我认为新的项目还是应该用hooks去编写,相比于类组件
函数式组件比类组件更简洁,不必在组件内部声明构造函数和 render 方法等
Hook 是 React 16.8 引入的新特性,它可以让函数式组件具备类组件所具备的状态和生命周期功能
虽然函数组件有这么多优点,但是官方也不会放弃类组件,所以我个人认为可以在大型项目根据实际情况,混用类组件与和函数组件。但是新手不建议这么使用。

如果有问题欢迎指正


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

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

相关文章

【Java网络编程】Socket套接字

哈喽&#xff0c;大家好~我是你们的老朋友&#xff1a; 保护小周ღ&#xff0c;本期为大家带来的是网络编程的前提概念 Socket 套接字&#xff0c;操作系统提供Socket 用于封装底层的协议细节和通信逻辑&#xff0c;使应用程序可以通过简单直观的API与网络进行交互。所以客观的…

在poetry虚拟环境下打包exe

本博客介绍了在poetry虚拟环境下打包exe的流程&#xff0c;包含两个部分 打包的基本流程打包过程中遇到的问题 打包的基本流程 copy打包工具到本地,&#xff08;share:\公用共享\芯片部\乔羽\img_generate\系统部提供的打包exe工具&#xff09; 用poetry搭建虚拟环境 在打包…

微积分入门

文章目录 前言初期积分微分微积分问题 后期极限 ε \varepsilon ε- δ \delta δ极限勒贝格积分 结语 前言 微积分总共走过了两个时期。首先是牛顿和莱布尼茨利用无穷小量定义微分和积分&#xff0c;并且发现了微分和积分的关系&#xff0c;这是第一个时期&#xff0c;这时的…

如何在元宇宙中促进品牌增长:消费者喜好的热点调查

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;5分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 音乐和旅游是用户被元宇宙虚拟体验所吸引的前两个领域。根据Reach 3 Insights的…

ArrayList 的特点及优缺点

前面讲过&#xff0c;数组有很多缺点且使用不太方便&#xff0c;但是我们存储数据的时候很多情况又不得不使用它&#xff0c;那么有没有对数组封装一下的类&#xff0c;让我们更方便呢&#xff1f;答案是有的&#xff0c;他就是 ArrayList&#xff0c;他是一个基于数组的集合&a…

Ceph入门到精通- storcli安装

storcli 是LSI公司官方提供的Raid卡管理工具&#xff0c;storcli已经基本代替了megacli&#xff0c;是一款比较简单易用的小工具。将命令写成一个个的小脚本&#xff0c;会将使用变得更方便。 安装简单&#xff0c;Windows系统下解压出来以后可以直接运行。 Linux系统默认位置…

CGI, FastCGI, WSGI, uWSGI, uwsgi一文搞懂

1. CGI # 1、通用网关接口&#xff08;Common Gateway Interface/CGI&#xff09;是一种重要的互联网技术&#xff0c;可以让一个客户端&#xff0c;从网页浏览器向执行在网络服务器上的程序请求数据。CGI描述了服务器和请求处理程序之间传输数据的一种标准。 # 2、CGI程序可以…

今儿咱就看看redis的淘汰策略你知道多少

一、前言 Redis在我们日常开发中是经常用到的&#xff0c;Redis也是功能非常强大&#xff0c;可以进行缓存&#xff0c;还会有一些排行榜、点赞、消息队列、购物车等等&#xff1b;当然还有分布式锁Redisson&#xff0c;我们使用肯定少不了集群&#xff01;小编最近学习到一些…

AI-ISP:手机相机是如何将风景变成图片的?

文章目录 前言1. ISP芯片2. Sensor知识3. RAW数据4. ISP Pipeline5. AI-ISP结束语 前言 本篇文章只干一件事&#xff1a;AI-ISP&#xff1a;手机相机是如何将风景变成图片的&#xff1f; 1. ISP芯片 一颗小小的SoC芯片(10mm x 10mm)上集成了一百多亿个晶体管(Kirin 9000有153亿…

【pandas】Python读取DataFrame的某行或某列

行索引、列索引、loc和iloc import pandas as pd import numpy as np # 准备数据 df pd.DataFrame(np.arange(12).reshape(3,4),indexlist("abc"),columnslist("WXYZ"))行索引(index)&#xff1a;对应最左边那一竖列 列索引(columns)&#xff1a;对应最…

建筑数据破解JS逆向爬虫

建筑数据破解JS逆向爬虫 地址&#xff1a;https://jzsc.mohurd.gov.cn/data/project GitHub地址&#xff1a;https://github.com/NearHuiwen/JzscCrawler RequestsPyExecJS JS文件&#xff1a;req_aes.js 目标 抓包&#xff0c;抓取建筑市场数据(注&#xff1a;用于学习&am…

multi-scale training多尺度训练

文章目录 背景参考1&#xff1a;[输入不同长度的向量,输出相同长度](https://www.zhihu.com/question/569406523/answer/2780168200)&#xff1a;参考2&#xff1a;[多种尺寸的图像数据训练没有全连接层的卷积神经网络模型](https://www.zhihu.com/question/533481647)参考3&am…

展开说说:Adobe XD 哪个版本好用?

工具还是得顺着自己的习惯才是最好 即时设计 - 可实时协作的专业 UI 设计工具即时设计是一款支持在线协作的专业级 UI 设计工具&#xff0c;支持 Sketch、Figma、XD 格式导入&#xff0c;海量优质设计资源即拿即用。支持创建交互原型、获取设计标注&#xff0c;为产设研团队提…

如何快速将PDF文件转换为Word文档

PDF文件是一个广泛使用的电子文档格式&#xff0c;其被广泛应用于各种领域&#xff0c;包括教育、商业和政府。虽然PDF文件非常实用&#xff0c;但有时你需要将其转换为Word文档&#xff0c;以便更方便地编辑和处理。以下是几种快速将PDF文件转换为Word文档的方法。 1. 使用在…

Linux Shell 实现一键部署http+用户名密码登录

Apache 前言 Apache(音译为阿帕奇)是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;由于其跨平台和安全性被广泛使用&#xff0c;是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充&#xff0c;将Perl/Python等…

【python】采集天气数据并作可视化,怀念一下之前得好天气

前言 这几天&#xff0c;长沙得天气突然爆冷&#xff0c;每天上班跟渡劫一样 生怕一不小心&#xff0c;风就把伞吹跑了&#xff0c;人湿点无所谓&#xff0c;但是我得伞不能有事 现在得我无比怀念之前得好天气&#xff0c;今天我就来采集一下天气数据并作个可视化怀念一下它…

C# 特性(Attribute)

一、特性&#xff08;Attribute&#xff09;定义 特性&#xff08;Attribute&#xff09;是用于在运行时传递程序中各种元素&#xff08;比如类、方法、结构、枚举、组件等&#xff09;的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。 特性使用中括号…

ArduPilot之开源代码框架

ArduPilot之开源代码框架 1. 系统框架2. 工程框架2.1 工程目录2.2 代码组成2.3 运行流程 4. 硬件传感器总线4.1 I2C4.2 SPI4.3 UART4.4 CAN 5. 软件设计概念6. 总结7. 参考资料 在研读ArduPilot的过程&#xff0c;尝试用一些中文的词汇来描述&#xff0c;可能会造成某些理解上的…

sparksql select后插入自己 报错 Cannot overwrite a path that is also being read from

问题现象 spark.version < 3.0.1 执行下面语句报错: Cannot overwrite a path that is also being read from ... 哪些情况算同时读写自己? 如果读自己和写自己在一个spark stage中,就算同时读写自己. spark.table("tb1")// 其他stransform.write.mode("…

运维监控工具PIGOSS BSM扩展指标介绍

PIGOSS BSM运维监控工具&#xff0c;除系统自带指标外&#xff0c;还支持添加SNMP扩展指标、脚本扩展指标、JMX扩展指标、自定义JDBC指标等&#xff0c;今天本文将介绍如何添加SNMP扩展指标和脚本扩展指标。 添加SNMP扩展指标 前提&#xff1a;需要知道指标的oid 例子&#xff…