react中useEffect函数的详细用法

server/2024/12/22 20:12:20/

1、函数介绍

useEffect 是 React 中的一个 Hook,用于在函数组件中处理副作用(如数据获取、订阅、手动更改 DOM 等)。与类组件中的生命周期方法(如 componentDidMountcomponentDidUpdatecomponentWillUnmount)类似,useEffect 让你在函数组件中完成相同的操作。( from chatGPT)

        简单来说,useEffect属于组件的生命周期方法。在组件不同的生命周期,我们可以通过useEffect函数来控制执行过程。 那么什么是组件的生命周期呢?

2.组件的生命周期

        在 React 中,组件的生命周期分为三个主要阶段:挂载(Mounting)、更新(Updating)和卸载(Unmounting)。挂载和渲染是关键的生命周期阶段,理解它们对于有效地使用 React 至关重要。

2.1 挂载(Mounting)

载是指组件第一次被插入到 DOM 中的过程。挂载阶段包括以下步骤:

  1. 构造函数(Constructor):组件的构造函数被调用。如果你在类组件中定义了构造函数,那么它会在组件实例化时首先被调用。
  2. getDerivedStateFromProps(静态方法):在初始化和更新期间调用,允许组件基于输入的 props 来更新状态。它是一个静态方法,不能访问组件实例。
  3. render:渲染方法被调用。它返回要渲染的元素(通常是 JSX)。
  4. componentDidMount:组件已经被挂载到 DOM 中,此时可以执行一些副作用操作,比如数据获取、订阅事件等。

2.2 渲染和更新

渲染(Rendering)

渲染是指组件根据其当前状态和属性生成要显示的元素。每次组件的状态或属性发生变化时,渲染过程都会被触发。渲染阶段包括:

  1. render 方法(类组件):被调用以生成虚拟 DOM 结构。
  2. 函数组件本身:被调用以生成虚拟 DOM 结构。

在每次状态或属性变化时,组件会重新渲染。React 将对比虚拟 DOM(使用 Diff 算法)并更新实际 DOM 以反映变化。

更新(Updating)

更新是指组件的状态或属性发生变化并重新渲染的过程。更新阶段包括以下步骤:

  1. getDerivedStateFromProps(静态方法):同挂载阶段一样,在属性变化时调用。
  2. shouldComponentUpdate:决定组件是否应该重新渲染。返回 true 表示重新渲染,返回 false 表示跳过更新。
  3. render:渲染方法被调用以生成新的虚拟 DOM 结构。
  4. getSnapshotBeforeUpdate:在 DOM 更新之前被调用,返回的值将作为 componentDidUpdate 的第三个参数。
  5. componentDidUpdate:组件更新并重新渲染到 DOM 之后调用,可执行副作用操作。

2.3 卸载(Unmounting)

卸载是指组件被移出 DOM 的过程。卸载阶段只包括一个方法:

  1. componentWillUnmount:组件即将卸载时调用,可以在这里执行清理操作,例如取消订阅、清除定时器等。

2.4 总结

  • 挂载:组件第一次被插入到 DOM 中时执行。类组件中使用 componentDidMount,函数组件中使用 useEffect(空依赖数组)。
  • 渲染:每次组件的状态或属性变化时,都会重新生成虚拟 DOM 并更新实际 DOM。
  • 更新:状态或属性变化引起组件重新渲染。类组件中使用 componentDidUpdate,函数组件中使用 useEffect(依赖数组)。
  • 卸载:组件被移出 DOM 时执行。类组件中使用 componentWillUnmount,函数组件中通过 useEffect 的清理函数处理。

3、函数的基本用法

        有了对组件生命周期的认识,那么就可以利用useEffect函数根据组件不同的生命周期阶段来执行不同的方法。比如:

  • 有的方法只希望在执行一次,即在组件挂载的时候执行一次就够了,后面也不需要再次执行
  • 有的方法希望在组件每次渲染(元素有更新)的时候都执行
  • 有的方法希望在某个依赖的变量发生变化时才会执行
  • 有的方法希望在组件卸载(页面退出的)的时候执行

上面的执行过程都都可以通过useEffect方法做到。

3.1 用法示例

import React, { useState, useEffect } from 'react';function ExampleComponent() {const [count, setCount] = useState(0);useEffect(() => {// 这里的代码相当于 componentDidMount 和 componentDidUpdatedocument.title = `You clicked ${count} times`;// 如果需要清理,可以返回一个函数return () => {// 这里的代码相当于 componentWillUnmountconsole.log('Cleaning up...');};}, [count]); // 依赖数组return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}export default ExampleComponent;

3.2 用法说明

  • 副作用的执行

    • useEffect 的第一个参数是一个函数,它在组件渲染后执行。可以在这个函数内进行副作用操作。
    • 如果需要清理副作用,可以在这个函数中返回一个函数,这个返回的函数会在组件卸载或副作用重新执行前调用。
  • 依赖数组

    • useEffect 的第二个参数是一个依赖数组(可以依赖多个变量),表示副作用依赖的变量。当依赖数组中的任何一个变量发生变化时,副作用函数会重新执行。
    • 如果依赖数组为空([]),副作用函数只会在组件挂载和卸载时执行一次,类似于 componentDidMountcomponentWillUnmount
    • 如果不传依赖数组,副作用函数会在每次组件渲染后执行,类似于 componentDidUpdate

3.3 使用规则

  1. 在组件顶层调用:只能在 React 函数组件或自定义 Hook 的顶层调用 useEffect,不要在循环、条件或嵌套函数中调用。
  2. 依赖数组:确保正确设置依赖数组,以避免不必要的副作用执行或缺少必要的更新。

http://www.ppmy.cn/server/49519.html

相关文章

Linux | grep命令和 find命令有什么区别

如是我闻&#xff1a; 他们俩都是linux系统中具有查找功能的命令&#xff0c;但是grep 和 find 用于不同的目的。grep 用于在文件中查找文本模式&#xff0c;而 find 用于在文件系统中查找文件和目录。下面是它们的主要区别&#xff1a; grep 用途&#xff1a; grep 是用于在…

为什么选择Python作为AI开发语言

为什么Python适合AI 在当前的科技浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;无疑是最热门的话题之一。无论是自动驾驶、智能推荐还是自然语言处理&#xff0c;AI都在不断改变我们的生活。而在这场技术革命中&#xff0c;Python作为主要的编程语言之一&#xff0c;…

MySQL Explain 关键字详解

概述 explain 关键字可以模拟执行 sql 查询语句&#xff0c;输出执行计划&#xff0c;分析查询语句的执行性能 使用方式如下&#xff1a;explain sql explain select * from t1执行计划各字段含义 1. id 如果 id 序号相同&#xff0c;从上往下执行如果 id 序号不同&#…

MySQL常见的命令

MySQL常见的命令 查看数据库&#xff08;注意添加分号&#xff09; show databases;进入到某个库 use 库; 例如&#xff1a;进入test use test;显示表格 show tables;直接展示某个库里面的表 show tables from 库&#xff1b; 例如&#xff1a;展示mysql中的表格 show tabl…

LabVIEW回热系统热经济性分析及故障诊断

开发了一种利用LabVIEW软件的电厂回热系统热经济性分析和故障诊断系统。该系统针对火电厂回热加热器进行优化&#xff0c;通过实时数据监控与分析&#xff0c;有效提高机组的经济性和安全性&#xff0c;同时降低能耗和维护成本。系统的实施大幅提升了火电厂运行的效率和可靠性&…

Elasticsearch-ES查询单字段去重

ES 语句 整体数据 GET wkl_test/_search {"query": {"match_all": {}} }结果&#xff1a; {"took" : 123,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0…

【5.x】ELK日志分析、集群部署

ELK日志分析 一、ELK概述 1、ELK简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将ElasticSearch、Logstash和Kiabana三个开源工具配合使用&#xff0c;完成更强大的用户对日志的查询、排序、统计需求。 一个完整的集中式日志系统&#xff0c;需要包含以下几个主…

【postgresql初级使用】条件表达式触发器,兼顾DML执行性能,又能执行复杂逻辑,只在结帐时计算总帐

条件触发器 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 文章目录 条件触发器概…