13 React useEffect 详解

news/2024/4/27 14:46:07

useEffect 是 React 中用于处理副作用操作的 Hook。副作用包括数据获取、订阅操作、手动修改 DOM 等。以下是一些 useEffect 的示例以及需要注意的知识:

1. 数据获取

import React, { useState, useEffect } from 'react';function DataFetching() {const [data, setData] = useState(null);useEffect(() => {const fetchData = async () => {const response = await fetch('https://api.example.com/data');const result = await response.json();setData(result);};fetchData();}, []); // 空数组作为依赖表示只在组件挂载时执行一次return (<div>{data && <p>Data: {data}</p>}</div>);
}
  • 需要注意的知识:
    • 异步操作应当在 useEffect 内部进行,以确保在组件渲染完成后执行。
    • 使用空依赖数组 [] 可以确保 useEffect 仅在组件挂载时执行一次。

2. 订阅操作

import React, { useState, useEffect } from 'react';function Subscription() {const [count, setCount] = useState(0);useEffect(() => {const intervalId = setInterval(() => {setCount(prevCount => prevCount + 1);}, 1000);return () => {clearInterval(intervalId);};}, []); // 空数组作为依赖表示只在组件挂载时执行一次return (<div><p>Count: {count}</p></div>);
}
  • 需要注意的知识:
    • useEffect 可以返回一个清理函数,在组件销毁时执行,用于清除副作用,比如取消订阅、清除定时器等。

3. 监听属性变化

import React, { useState, useEffect } from 'react';function PropChanges({ prop }) {const [count, setCount] = useState(0);useEffect(() => {setCount(count + 1);}, [prop]); // 当 prop 变化时触发 useEffectreturn (<div><p>Count: {count}</p></div>);
}
  • 需要注意的知识:
    • 通过传递一个包含变量的数组作为 useEffect 的依赖,可以监听该变量的变化并执行相应的副作用操作。

4. 手动修改 DOM

import React, { useEffect } from 'react';function DOMManipulation() {useEffect(() => {document.title = 'New Title';return () => {document.title = 'Original Title';};}, []); // 空数组作为依赖表示只在组件挂载时执行一次return (<div><p>DOM Manipulation Example</p></div>);
}
  • 需要注意的知识:
    • useEffect 内部可以进行一些 DOM 操作,但是需要确保操作不会导致 React 和 DOM 同步问题。
    • 返回的清理函数可以用来恢复原始状态,以避免内存泄漏或者其他副作用。

5. 使用多个 useEffect

import React, { useState, useEffect } from 'react';function MultipleEffects() {const [count, setCount] = useState(0);const [data, setData] = useState(null);useEffect(() => {// effect for countdocument.title = `Count: ${count}`;return () => {document.title = 'Original Title';};}, [count]); // 当 count 变化时触发 useEffectuseEffect(() => {// effect for dataconst fetchData = async () => {const response = await fetch('https://api.example.com/data');const result = await response.json();setData(result);};fetchData();return () => {// cleanup for data};}, []); // 空数组作为依赖表示只在组件挂载时执行一次return (<div><p>Count: {count}</p>{data && <p>Data: {data}</p>}<button onClick={() => setCount(count + 1)}>Increment</button></div>);
}
  • 需要注意的知识:
    • 可以在同一个组件中使用多个 useEffect,每个 useEffect 之间相互独立。
    • 每个 useEffect 可以有自己的清理函数。

useEffect 的依赖可以分为三种情况:

  1. 空依赖数组:表示 useEffect 仅在组件挂载时执行一次。
  2. 包含具体依赖的数组:表示 useEffect 会在指定依赖发生变化时执行。
  3. 没有依赖数组:表示 useEffect 在每次组件渲染时都会执行。

下面是针对每种情况的详细示例以及注意知识:

1. 空依赖数组

import React, { useState, useEffect } from 'react';function EmptyDependencyExample() {const [count, setCount] = useState(0);useEffect(() => {console.log("Component mounted");return () => {console.log("Component unmounted");};}, []); // 空依赖数组表示仅在组件挂载和卸载时执行return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);
}export default EmptyDependencyExample;
  • 注意知识:
    • 使用空依赖数组 [] 可以确保 useEffect 仅在组件挂载时执行一次。
    • 清理函数用于执行清理工作,比如取消订阅、清除定时器等。

2. 具体依赖的数组

import React, { useState, useEffect } from 'react';function DependencyArrayExample({ prop }) {const [count, setCount] = useState(0);useEffect(() => {console.log("Component mounted or prop changed");// 每次 prop 或 count 变化时都会触发 useEffectreturn () => {console.log("Component unmounted or prop changed");};}, [prop, count]); // 传入依赖数组表示当其中任一依赖变化时执行return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);
}export default DependencyArrayExample;
  • 注意知识:
    • 通过传递一个包含变量的数组作为 useEffect 的依赖,可以监听该变量的变化并执行相应的副作用操作。
    • 当数组中的任一依赖变化时,useEffect 将会重新执行。

3. 没有依赖数组

import React, { useState, useEffect } from 'react';function NoDependencyExample() {const [count, setCount] = useState(0);useEffect(() => {console.log("Component rendered");return () => {console.log("Component re-rendered");};}); // 没有依赖数组表示在每次组件渲染时执行return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);
}export default NoDependencyExample;
  • 注意知识:
    • 没有传递依赖数组时,useEffect 在每次组件渲染时都会执行。
    • 当需要在组件渲染时执行某些操作,而不是依赖于特定的变量时,可以使用没有依赖数组的 useEffect

一个函数组件中可以包含多个 useEffect。每个 useEffect 都可以处理不同的副作用,使代码更模块化和可维护。下面是一个示例:

import React, { useState, useEffect } from 'react';function MultipleEffectsExample() {const [count, setCount] = useState(0);const [data, setData] = useState(null);// 第一个 useEffect 处理 count 的副作用useEffect(() => {document.title = `Count: ${count}`;return () => {document.title = 'Original Title';};}, [count]); // 依赖于 count 的变化// 第二个 useEffect 处理 data 的副作用useEffect(() => {const fetchData = async () => {const response = await fetch('https://api.example.com/data');const result = await response.json();setData(result);};fetchData();return () => {// 在组件卸载或者 data 更新时执行清理操作// 比如取消请求等};}, [data]); // 依赖于 data 的变化return (<div><p>Count: {count}</p><p>Data: {data}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);
}export default MultipleEffectsExample;

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

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

相关文章

python初级第一次作业

一、 dayint(input("enter today day")) fdayint(input("enter num of day since today")) c((fday%7)day)%7 if c0:print("sunday") elif c1:print("monday") elif c2:print("tuesday") elif c3:print("wendnsday&quo…

景联文科技上新高质量大模型训练数据!

在过去的一年中&#xff0c;人工智能领域呈现出了风起云涌的态势&#xff0c;其中模型架构、训练数据、多模态技术、超长上下文处理以及智能体发展等方面均取得了突飞猛进的发展。 在3月24日举办的2024全球开发者先锋大会的大模型前沿论坛上&#xff0c;上海人工智能实验室的领…

链动2+1模式 完全合法合规 不存在传销问题!!

在商业经营中&#xff0c;营销策略的巧妙运用对于提升产品销量和扩大品牌影响力至关重要。然而&#xff0c;企业在制定和执行营销策略时&#xff0c;必须严格遵循法律法规&#xff0c;以免陷入法律风险。本文将着重探讨链动21模式的法律要素&#xff0c;以论证其合规性。 一、链…

npm i安装依赖报错,但是cnpm i 却安装成功

问题描述&#xff1a;在a项目中npm i 安装依赖时发生以上报错&#xff0c;但是cnpm i 却成功&#xff0c;而且在其他项目中npm i 安装其他项目依赖也能成功.... 解决办法&#xff1a;删除项目中package-lock.json文件后再npm i 即可

Redis入门到实战-第三弹

Redis入门到实战 Redis数据类型官网地址Redis概述Redis数据类型介绍更新计划 Redis数据类型 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#…

nodejs+vue高校门诊管理系统python-flask-django-php

相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低高校门诊的运营人员成本&#xff0c;实现了高校门诊管理的标准化、制度化、程序化的管理&#xff0c;有效地防止了高校门诊管理的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够及时…