Day7:浅谈useEffect

news2024/11/26 18:44:55

「目标」: 持续输出!每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。

Day7-今日话题

useEffect 是 React 中一个非常重要的 Hook,用于处理副作用和订阅外部数据源的变化。它可以在函数式组件中执行各种操作,例如数据获取、订阅事件、手动DOM操作等。下面我将从以下五个角度介绍useEffect

  1. 用法
  2. 作用
  3. 工作原理
  4. 优缺点
  5. 使用注意点

对于经常使用vue进行开发的同学来说,可以类比成watch

用法

useEffect 在函数式组件内被调用,用于在组件渲染后执行副作用操作,它接受两个参数。

第一个参数是一个回调函数,该函数包含副作用操作的代码, 可以可选地返回一个清理函数,用于在组件卸载或下一次副作用触发前执行清理操作。

第二个参数是一个数组,用于指定依赖项。如果依赖项发生变化,useEffect 将重新运行。如果为空数组,useEffect 仅在组件挂载和卸载时运行一次


import React, { useEffect } from 'react';

function MyComponent({
  useEffect(() => {
    // 这里编写副作用操作
    // 返回一个清理函数,可选
    return () => {
      // 在组件卸载或下一次副作用触发前执行清理操作
    };
  }, [dependencies]);
  
  // 组件的其他代码
}

作用

  • 处理副作用操作,例如数据获取、订阅事件、DOM 操作等。
  • 在组件挂载和更新时触发副作用操作。
  • 在组件卸载时清理副作用操作,以防止内存泄漏和不必要的副作用。

工作原理

概括

useEffect 利用 React 的调度机制,在组件渲染后执行指定的副作用操作。React 会确保在浏览器完成绘制之后才执行这些操作,以避免阻塞渲染。

详细

  • 「组件挂载」:当一个组件首次渲染到页面上时,React 会执行组件函数,包括其中的 useEffect 回调函数。这个回调函数中包含了需要执行的副作用操作。此时,React 不会等待副作用操作完成,而是将其加入一个队列中,以便稍后执行。

  • 「浏览器绘制完成后执行」:React 会等待浏览器完成当前的渲染工作,确保页面元素已经呈现给用户。一旦浏览器完成绘制,React 会执行队列中的副作用操作。这可以确保副作用操作不会阻塞页面的渲染,从而提高用户体验。

  • 「组件更新」:当组件的状态或 props 发生变化时,React 会重新渲染组件。如果在 useEffect 中指定了依赖项数组,React 将比较当前的依赖项和上一次渲染时的依赖项。如果它们不一致,说明依赖项发生变化,React 将再次执行 useEffect 中的回调函数。

  • 「清理操作」:如果 useEffect 中返回了一个函数(清理函数),这个函数将在下一次副作用操作执行之前运行。这通常用于清理资源、取消订阅或处理副作用的清理工作。

  • 「组件卸载」:当组件从页面中卸载时(如路由切换或组件不再需要渲染),React 会执行清理函数(如果存在),以确保释放副作用操作可能持有的资源,从而避免内存泄漏。

  • 「性能优化」:React 还会进行一些性能优化,例如将多个 useEffect 中的副作用操作合并成一个以减少不必要的工作。这是通过内部的调度机制来实现的,React 会智能地决定何时执行哪些副作用操作。

优缺点

  • 优点:
    • 可以用于处理副作用操作,保持组件的纯粹性。
    • 可以轻松管理副作用的触发时机。
    • 可以避免内存泄漏,清理不再需要的资源。
  • 缺点:
    • 如果不小心使用,可能会导致性能问题,因为副作用函数可能在每次渲染时都被调用。
    • 需要小心处理副作用函数的依赖项,否则可能会导致无限循环调用。

使用注意点

  • 避免在副作用操作中修改组件状态,以免导致循环更新。
  • 如果需要在 useEffect 中访问组件的 state 或 props,确保将它们添加到依赖项数组中,以防止闭包陷阱。
  • 注意清理操作,确保在组件卸载时释放资源或取消订阅。
  • 如果有多个 useEffect,可以将它们拆分为不同的副作用逻辑,以提高可读性。

欢迎点赞、关注、转发~ alt

本文由 mdnice 多平台发布

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

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

相关文章

小程序如何上传微信聊天记录的文件

wx.chooseMessageFile({count: 10,type: image,success (res) {// tempFilePath可以作为img标签的src属性显示图片const tempFilePaths res.tempFiles} })参数说明 回调函数说明

数据库实现学生管理系统

1.QT将数据库分为三个层次: 1> 数据库驱动层:QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin 2> sql接口层:QSqlDatabase、QSqlQuery、QSqlRecord、QSqlError 3> 用户接口层:提供一些模型QSql…

开眼“观天”,从墨迹天气服贸会之旅看气象服务新未来

今年夏天,天气焦人。先是高温早早上线,然后台风来势汹汹,北京高温、河北暴雨,杜苏芮、苏拉、海葵轮番“奔袭”,极端气象事件频繁登上热搜,其险象环生的过程,让大众对气候问题的关注度节节走高。…

架构师 软件测试

架构师 软件测试 目录概述需求: 设计思路实现思路分析1.软件测试方法 软件测试工具 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for c…

cudnn-windows-x86_64-8.6.0.163_cuda11-archive 下载

网址不太好访问的话,请从下面我提供的分享下载 Download cuDNN v8.6.0 (October 3rd, 2022), for CUDA 11.x 此资源适配 cuda11.x 将bin和include文件夹里的文件,分别复制到C盘安装CUDA目录的对应文件夹里 安装cuda时自动设置了 CUDA_PATH_V11_8 及path C:\Progra…

1123. 最深叶节点的最近公共祖先

文章目录 Tag题目来源题目解读解题思路方法一:递归 写在最后 Tag 【递归】【最近公共祖先】【二叉树】 题目来源 1123. 最深叶节点的最近公共祖先,865. 具有所有最深节点的最小子树 此二题系重复的题目。 题目解读 题目意思很明确,找出二叉…

String类的常用方法(Java)

目录 一、字符串构造二、String对象的比较1、比较是否引用同一个对象2、boolean equals(Object anObject) 方法:按照字典序比较3、int compareTo(String s) 方法: 按照字典序进行比较4、int compareToIgnoreCase(String str) 方法:与compareTo方式相同&a…

SpringMVC相对路径和绝对路径

1.相对地址与绝对地址定义 在jsp,html中使用的地址,都是在前端页面中的地址,都是相对地址 地址分类:(1),绝对地址,带有协议名称的是绝对地址,http://www.baidu.com&…

c语言练习41:深入理解字符串函数strlen strcpy strcat

深入理解字符串函数strlen strcpy strcat 模拟实现&#xff1a;”strlen strcpy strcat strlen strcat: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<assert.h> strlen 1.通过指针移动模拟 //int my_strlen(char* str) { // size_t c…

Unity之创建第一个游戏

一 Unity环境配置 1.1 Untity资源官网下载&#xff1a;https://unity.cn/releases 1.2 Unity Hub集成环境&#xff0c;包含工具和项目的管理 1.3 Unity Editor编辑器 1.4 Visual Studio 2022脚本编辑器 1.5 AndroidSKD&#xff0c;JDK&#xff0c;NDK工具&#xff0c;用于and…

Python之写文件操作(二十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

长风破浪会有时,直挂云帆济沧海!(工作室年会总结)

前言 我也是有段时间没写过总结性的博客了。最近是很忙的&#xff0c;尤其是年会那两天&#xff0c;我甚至可以说这是我这辈子目前最忙的两天。但这段经历还是很值得我记录下来的&#xff0c;也是给后面有需要的人提供的一些建议。我个人也是第一次筹办这种大型些的活动&#x…

SpringBoot_第六章(知识点总结)

目录 1&#xff1a;拦截器(Interceptor) 1.1&#xff1a;拦截器代码实现 1.2&#xff1a;拦截器源码分析和流程总结 2&#xff1a;过滤器(Filter)、自定义(Servlet)、监听器(Listener) 3&#xff1a;文件上传 3.1&#xff1a;文件上传代码实现 3.2&#xff1a;文件上传源…

部署Redis集群

文章目录 部署Redis集群1. 准备集群主机2. 启用集群功能3. 配置管理主机并创建集群3.1 配置管理主机 192.168.88.573.2 创建集群创建集群命令创建集群失败解决办法 3.3 查看集群信息查看集群统计信息查看集群详细信息 4. **测试集群及集群工作原理**4.1. 访问集群存取数据4.2 *…

Jmeter进阶使用指南-使用参数化

Apache JMeter是一个广泛使用的开源负载和性能测试工具。在进行性能测试时&#xff0c;我们经常需要模拟不同的用户行为和数据&#xff0c;这时候&#xff0c;参数化就显得尤为重要。此文主要介绍如何在JMeter中使用参数化。 什么是参数化&#xff1f; 参数化是一种将静态值替…

OpenCV之ellipse函数

ellipse函数用来在图片中绘制椭圆、扇形&#xff0c;有两个重载函数。 函数原型1&#xff1a; void cv::ellipse( InputOutputArray img,Point center,Size axes,double angle,double startAngle,double …

ORB-SLAM2算法14之局部建图线程Local Mapping

文章目录 0 引言1 概述2 处理队列中的关键帧3 剔除坏的地图点4 创建新地图点5 融合当前关键帧和其共视帧的地图点6 局部BA优化7 剔除冗余关键帧 0 引言 ORB-SLAM2算法7详细了解了System主类和多线程、ORB-SLAM2学习笔记8详细了解了图像特征点提取和描述子的生成、ORB-SLAM2算法…

如何使用SpringCloud Eureka 创建单机Eureka Server-注册中心

&#x1f600;前言 本篇博文是关于使用SpringCloud Eureka 创建单机Eureka Server-注册中心&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&…

Jenkins实现基础CD操作

操作截图 在Jenkins里面设置通过标签进行构建 在Jenkins中进入项目&#xff0c;配置以下 将execute shell换到invoke top-level maven targets之前 在gitlab中配置标签 代码迭代新的版本 项目代码迭代 修改docker-compose.yml 提交新版本的代码 在Jenkins中追加新…

Java调用Web Service接口

方法1. 用IDEA生成相关代码调用方法。 在IDEA插件商店下载插件 然后新建一个Java项目 创建一个包来存放生成的代码&#xff0c;(点击一下)选中这个包&#xff0c;点击Tools 填入接口url&#xff0c;记住后面拼接“?wsdl”&#xff0c;选择生成方法&#xff0c;然后OK即可生…