【React】useEffect 钩子详解

文章目录

    • 一、useEffect 概念
    • 二、useEffect 的基本用法
      • 1. 无依赖项
      • 2. 空依赖项数组
      • 3. 带依赖项的 useEffect
    • 三、useEffect 的常见应用场景
      • 1. 数据获取
      • 2. 订阅与清除
      • 3. 动画与定时器
    • 四、useEffect 的进阶用法
      • 1. 多个 useEffect
      • 2. 条件执行副作用
    • 五、注意事项

useEffect 是 React 钩子函数之一,它使函数组件能够执行副作用操作。常见的副作用包括数据获取、订阅、手动更改 React 组件中的 DOM 以及定时器等。在类组件中,我们通常在生命周期方法中执行这些操作,而在函数组件中,我们使用 useEffect 来完成这些任务。本文将详细介绍 useEffect 的概念、用法及其在实际开发中的应用,旨在帮助开发者全面掌握这一重要特性。

一、useEffect 概念

useEffect 钩子是 React 16.8 版本引入的,它允许我们在函数组件中执行副作用操作。useEffect 函数接收两个参数:

  1. 一个副作用函数。
  2. 一个依赖项数组(可选)。

基本语法如下:

useEffect(() => {// 副作用逻辑return () => {// 清除逻辑(可选)};
}, [依赖项]);

二、useEffect 的基本用法

1. 无依赖项

如果不传递依赖项数组,副作用函数会在每次渲染后执行。

import React, { useEffect } from 'react';function MyComponent() {useEffect(() => {console.log('组件渲染或更新了');return () => {console.log('组件卸载了');};});return <div>Hello, useEffect!</div>;
}

上述代码中,console.log 会在每次组件渲染或更新时执行,而返回的清除函数会在组件卸载时执行。

2. 空依赖项数组

如果传递一个空数组作为依赖项,副作用函数只会在组件首次渲染时执行一次。

import React, { useEffect } from 'react';function MyComponent() {useEffect(() => {console.log('组件首次渲染');return () => {console.log('组件卸载');};}, []);return <div>Hello, useEffect!</div>;
}

3. 带依赖项的 useEffect

如果传递一个依赖项数组,副作用函数会在依赖项发生变化时执行。

import React, { useState, useEffect } from 'react';function MyComponent() {const [count, setCount] = useState(0);useEffect(() => {console.log(`Count 发生变化: ${count}`);return () => {console.log(`清除副作用: ${count}`);};}, [count]);return (<div><p>{count}</p><button onClick={() => setCount(count + 1)}>增加</button></div>);
}

上述代码中,当 count 发生变化时,副作用函数会执行,同时会先执行上一次渲染中的清除函数。

三、useEffect 的常见应用场景

1. 数据获取

在函数组件中使用 useEffect 可以方便地进行数据获取。

import React, { useState, useEffect } from 'react';function DataFetchingComponent() {const [data, setData] = useState(null);useEffect(() => {fetch('https://api.example.com/data').then(response => response.json()).then(data => setData(data));// 清除逻辑return () => {// 取消请求或其他清除操作};}, []); // 空依赖数组表示只在组件挂载和卸载时执行if (!data) {return <div>Loading...</div>;}return <div>{JSON.stringify(data)}</div>;
}

2. 订阅与清除

useEffect 也可以用于设置和清除订阅,例如事件监听器或 WebSocket 连接。

import React, { useEffect } from 'react';function EventListenerComponent() {useEffect(() => {const handleResize = () => {console.log('窗口大小改变');};window.addEventListener('resize', handleResize);// 清除逻辑return () => {window.removeEventListener('resize', handleResize);};}, []); // 空依赖数组表示只在组件挂载和卸载时执行return <div>请调整窗口大小查看效果</div>;
}

3. 动画与定时器

我们可以使用 useEffect 来设置和清除定时器或启动动画。

import React, { useState, useEffect } from 'react';function TimerComponent() {const [count, setCount] = useState(0);useEffect(() => {const intervalId = setInterval(() => {setCount(prevCount => prevCount + 1);}, 1000);// 清除逻辑return () => {clearInterval(intervalId);};}, []); // 空依赖数组表示只在组件挂载和卸载时执行return <div>计数: {count}</div>;
}

四、useEffect 的进阶用法

1. 多个 useEffect

在一个组件中可以使用多个 useEffect,每个 useEffect 可以负责不同的副作用操作。

import React, { useState, useEffect } from 'react';function MultiEffectComponent() {const [count, setCount] = useState(0);const [data, setData] = useState(null);useEffect(() => {document.title = `计数: ${count}`;}, [count]);useEffect(() => {fetch('https://api.example.com/data').then(response => response.json()).then(data => setData(data));}, []);return (<div><p>计数: {count}</p><button onClick={() => setCount(count + 1)}>增加</button><div>数据: {JSON.stringify(data)}</div></div>);
}

2. 条件执行副作用

通过条件判断,可以有选择地执行副作用逻辑。

import React, { useState, useEffect } from 'react';function ConditionalEffectComponent() {const [count, setCount] = useState(0);const [fetchData, setFetchData] = useState(false);const [data, setData] = useState(null);useEffect(() => {if (fetchData) {fetch('https://api.example.com/data').then(response => response.json()).then(data => setData(data));}}, [fetchData]);return (<div><p>计数: {count}</p><button onClick={() => setCount(count + 1)}>增加</button><button onClick={() => setFetchData(true)}>获取数据</button><div>数据: {JSON.stringify(data)}</div></div>);
}

五、注意事项

  1. 避免不必要的副作用:确保副作用函数只在需要时执行。使用依赖项数组来控制副作用的执行时机,避免不必要的重复执行。
  2. 清除副作用:副作用函数返回的清除函数用于清理不再需要的副作用。例如,清除事件监听器、取消订阅或清除定时器等。
  3. 依赖项数组:准确指定依赖项数组中的变量,确保副作用函数在依赖项发生变化时正确执行。遗漏或误包含依赖项可能导致副作用执行不符合预期。
  4. 处理异步操作:在处理异步操作时,注意在组件卸载时取消未完成的请求,避免内存泄漏。
  5. 性能优化:对于性能敏感的操作,确保合理使用 useEffect,避免过度渲染和不必要的副作用执行。

推荐:JavaScript


在这里插入图片描述

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

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

相关文章

微信公众号获取用户openid(PHP版,snsapi_base模式)

微信公众号获取用户openid的接口有2个&#xff1a;snsapi_base、snsapi_userinfo 详情见微信公众号开发文档&#xff1a;https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html 本文介绍用PHP方式调用snsapi_base接口获取微信用户…

Tomcat中的WebSocket是如何实现的?

Tomcat中的WebSocket是如何实现的&#xff1f; WebSocket是一种在客户端和服务器之间提供长期、双向、实时通信的协议 全双工通信&#xff1a;WebSocket允许数据同时在客户端和服务器双向通信&#xff0c;无需像HTTP等待请求和响应的循环 单个TCP连接&#xff1a;建立一次连…

Golang | Leetcode Golang题解之第287题寻找重复数

题目&#xff1a; 题解&#xff1a; func findDuplicate(nums []int) int {slow, fast : 0, 0for slow, fast nums[slow], nums[nums[fast]]; slow ! fast; slow, fast nums[slow], nums[nums[fast]] { }slow 0for slow ! fast {slow nums[slow]fast nums[fast]}return s…

【漏洞复现】Jenkins CLI 接口任意文件读取漏洞(CVE-2024-23897)

漏洞简介 Jenkins是一款基于JAVA开发的开源自动化服务器。 Jenkins使用args4j来解析命令行输入&#xff0c;并支持通过HTTP、WebSocket等协议远程传入命令行参数。在args4j中&#xff0c;用户可以通过字符来加载任意文件&#xff0c;这导致攻击者可以通过该特性来读取服务器上…

物联网主机 E6000:智慧应急领域的创新力量

在当今瞬息万变的世界中&#xff0c;突发事件和紧急情况时有发生。如何迅速、准确地应对这些挑战&#xff0c;保障人民生命财产安全&#xff0c;成为了社会发展的重要课题。而物联网主机 E6000 的出现&#xff0c;为智慧应急领域带来了全新的解决方案。 一、强大的性能与功能 物…

好用的缺陷(BUG)跟踪管理系统有哪些?

以下是一些常用的缺陷&#xff08;BUG&#xff09;跟踪管理系统&#xff0c;并对它们进行详细列出和比较&#xff0c;同时讨论哪些系统与LabVIEW兼容或常用于LabVIEW项目中。 1. Jira 功能 强大的问题跟踪和项目管理功能。丰富的自定义选项和插件支持。适用于敏捷开发的看板和…

第七章:贝叶斯分类器

目录 7.1 贝叶斯决策论 7.2 极大似然估计 7.3 朴素贝叶斯分类器 7.4 半朴素贝叶斯分类器 7.5 贝叶斯网 7.5.1 结构 7.5.2 学习 7.5.3 推断 7.6 EM算法 7.1 贝叶斯决策论 概率框架下实施决策的基本理论 给定N个类别&#xff0c;令代表将第j类样本误分类为第i类所产生的…

BFS实现迷宫最短路径

结合队列的知识利用 广度优先遍历&#xff0c;通过对能走的路径的记录以及对走过路径的标记&#xff0c;进行多条路搜查 一、理论基础 如下图的迷宫&#xff1a; 选取所走方向&#xff08;针对某一个位置&#xff09;下&#xff0c;右&#xff0c;上&#xff0c;左&#xff0…

如何进行小程序的调试

Errno错误码 在使用部分小程序 API / 组件时&#xff0c;抛出的异常&#xff08;fail 回调 / Promise reject&#xff09;Error 对象中除了带有 errMsg&#xff0c;还会带有通用错误码 errno。 代码示例 wx.openBluetoothAdapter({success (res) {console.log(res)}fail (er…

测试工作中常听到的名词解释 : )

背景 很多名称其实看字面意思都挺抽象的&#xff0c;有时看群里的测试大佬在不停蹦这类术语&#xff0c;感觉很高大上&#xff0c;但其实很多你应该是知道的&#xff0c;只不过没想到别人是这样叫它的。又或者你的主编程语言不是 Java&#xff0c;所以看不懂他们在讲啥&#x…

微服务安全——OAuth2.1详解、授权码模式、SpringAuthorizationServer实战、SSO单点登录、Gateway整合OAuth2

文章目录 Spring Authorization Server介绍OAuth2.0协议介绍角色OAuth2.0协议的运行流程应用场景授权模式详解客户端模式密码模式授权码模式简化模式token刷新模式 OAuth 2.1 协议介绍授权码模式PKCE扩展设备授权码模式拓展授权模式 OpenID Connect 1.0协议Spring Authorizatio…

Spring Boot:图书管理系统(一)

1.编写用户登录接口 代码&#xff1a; package com.example.demo;import jakarta.servlet.http.HttpSession; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotatio…

基环树简介

【基环树简介】 ● 众所周知&#xff0c;树上没有环。一棵树由 n 个结点及 n−1 条边构成。 ● 基环树是由 n 个结点及 n 条边组成的连通图。 显然&#xff0c;基环树上存在环。因此&#xff0c;基环树本质上不是树&#xff0c;而是图。基环树又称章鱼图。 基环树的的特别之处就…

qtscrcpy 环境搭建 基于qt5.14.2 vs2017

下载软件 qt5.14.2Visual Studio 2017 Community 安装文件链接参考文末 安装说明 Visual Studio 2017 Community&#xff0c; 一键安装&#xff0c;只需要 c 模块即可 qt5.14.2 安装需要选择msvc 2017 32bit, 因为 ffmpeg 编译的是 32bit 代码下载 https://gitee.com/…

1.ESP32-CAM 下使用 ESP-IDF 打开摄像头

主要资料&#xff1a; 乐鑫官方编程指南 ESP-IDF 编程指南安信可官方模块页 安信可-ESP32-CAM摄像头开发板官方使用教程 安信可ESP32-CAM摄像头开发demo–局域网拍照、实时视频、人脸识别 &#xff08;开发环境是Linux&#xff09; 本文目标是在 Windows 下跑通摄像头 hello …

大数据-52 Kafka 基础概念和基本架构 核心API介绍 应用场景等

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

苍穹外卖01

0. 配置maven (仅一次的操作 1.项目导入idea 2. 保证nginx服务器运行 &#xff08;nginx.exe要在非中文的目录下&#xff09; 开启服务&#xff1a; start nginx 查看任务进程是否存在&#xff1a; tasklist /fi "imagename eq nginx.exe" 关闭ngi…

【优秀python web系统毕设】基于python的全国招聘数据分析可视化系统,包括随机森林算法

1.1 研究背景 自1997年互联网开始在国内的招聘行业发展至今已有二十几年的历史&#xff0c;互联网招聘进入了蓬勃发展的“黄金时代”。根据智研咨询发布的《2023年中国互联网招聘行业发展现状》报告显示&#xff0c;截至2023年5月&#xff0c;中国互联网招聘平台中&#xff0c…

Navicat 17 新特性 | Navicat BI 功能革新升级,助力企业深度挖掘数据潜能

随着 Navicat 17 的发布&#xff0c;在业界引起了广泛的共鸣与热议。我们曾深入剖析其众多革新特性&#xff0c;包括模型设计创新与优化、高效的查询与配置、用户界面交互体验再升级&#xff0c;原生适配国产平台和操作系统和数据字典提升数据结构清晰度&#xff0c;这些新特性…

MySQL查询优化 limit 100000,10加载很慢该怎么优化

需求&#xff1a;查询19年以后发布的商品 数据库表结构如下&#xff1a; 目前数据量&#xff1a;264751 优化前执行时间&#xff1a;0.790s 优化后执行时间&#xff1a;0.467s select id,no,title,cart_title,cid_name from tb_item where id > (select id from tb_item …