useEffect Hook 介绍
hookuseEffect
是一个强大的工具,作为 Hooks API 的一部分在 React 16.8 中引入。它允许开发人员执行副作用,例如更新 DOM、获取数据和订阅功能组件中的事件。之前useEffect
,类组件用于处理此类副作用,但有了 Hooks,开发人员无需编写类就可以实现相同的功能。hookuseEffect
用途广泛,可用于广泛的任务,使其成为 React 开发中流行且重要的功能。
在本文中,您将了解useEffect
钩子以及如何在 React 应用程序中使用它。您将使用函数组件,因为 React Hooks 不能在类内部工作。
先决条件
理解本文需要具备以下条件:
- 安装Node.js
- JavaScript 和 React 的基础知识
开始
用于 yarn create vite <project-name>
创建新的 React 项目。使用 Vite 是因为它在 React 应用程序的开发和构建时间上速度很快。
通过运行以下命令启动应用程序:
cd project-name
yarn run dev
UseEffect Hook 语法和默认行为
useEffect
是一个接受两个参数的函数,一个回调函数和一个依赖数组。要在您的项目中使用钩子创建副作用useEffect
,请在功能组件中导入钩子以访问状态和道具,而无需编写额外的代码。useEffect
默认情况下在每次渲染后运行。它在第一次渲染后和每次更新后运行。以下是如何在功能组件中
声明钩子的示例:useEffect
// App.js
import React, {useState, useEffect} from 'react'
const App =()=> {
const [count, setCount] = useState(0)
useEffect(()=>{
console.log(count);
})
return (
<div style={{textAlign: "center", marginTop: "90px"}}>
<button onClick={() => setCount(prevCount => prevCount + 1)}>Increment Counter </button>
<h1>This is {count} </h1>
</div>
)
}
export default App;
上面的代码片段执行以下操作:
- 从 React导入
useEffect
和导入useState
- 使用其相应的设置函数创建状态变量,并使用
0
as 值初始化状态 - 添加一个带有单击处理程序的按钮,通过传入一个函数来增加计数,以便在单击按钮时更新先前的状态
- 在组件内部调用
useEffect
函数并传入函数,该函数在每次渲染组件后执行
防止useEffect Hook中的无限循环
useEffect
在每次渲染之后运行,并且在渲染时可能会导致无限循环,在某些情况下,这可能会导致性能问题。为防止这种情况,您需要有条件地useEffect
从功能组件运行 Hook,并在调用该函数时提供称为“依赖数组”的第二个参数useEffect
。
依赖项数组通常包含值,如果值从一个渲染更改为下一个渲染,它将导致运行useEffect
。这有助于限制效果运行的次数并确定它何时运行而不是在每次渲染后运行。
// App.js
...
useEffect(()=>{
console.log(count);
}, [])
...
在上面的代码中,该useEffect
函数包含一个数组作为其第二个参数,称为依赖数组。
一个空的依赖数组表示该函数会在组件加载时首先运行一次,并且没有依赖可以监视并触发效果再次运行。
useEffect
您可以通过添加到依赖项数组来在每次count
更改时运行该函数count
,如下所示:
// App.js
...
useEffect(()=>{
console.log(count);
}, [count])
...
在上面的代码中,当组件第一次运行时,状态从初始值 开始0
,在任何count
调用 的地方,该值都被替换为0
,包括依赖数组。点击Increment Counter按钮手动触发组件的重新渲染并将状态count
从更新0
为1``count``1
在下面的代码片段中,您将从meme API获取 meme 图像,并在单击按钮时显示新图像。您可以使用useEffect
它从服务器获取数据并毫无问题地显示它。渲染组件后,它将获取并渲染数据。
// Meme.js
import React, { useState, useEffect } from "react";
const Meme = () => {
const [memeData, setMemeData] = useState({randomImage: "http://i.imgflip.com/1bij.jpg"});
const [allMemeImages, setAllMemeImages] = useState([]);
useEffect(() => {
fetch("https://api.imgflip.com/get_memes")
.then((res) => res.json())
.then((data) => setAllMemeImages(data.data.memes));
}, []);
const handleClick = () => {
const randomNum = Math.floor(Math.random() * allMemeImages.length);
const url = allMemeImages[randomNum].url;
setMemeData((prevState) => {
return {
...prevState,
randomImage: url,
};
});
};
return (
<div style={{ textAlign: "center", marginTop: "90px" }}>
<button onClick={handleClick}>Get a new meme image</button>
<div style={{ textAlign: "center", marginTop: "90px" }}>
<img
src={memeData.randomImage}
alt='meme-images'
style={{ width: "300px", height: "300px" }}
/>
</div>
</div>
);
};
export default Meme;
上面的代码执行以下操作:
- 从 React导入
useEffect
和导入useState
- 声明初始状态以在组件的第一个渲染器上使用 set 函数
metadata
显示图像setMemeData
allMemeImages
声明用于存储来自 meme API 端点的所有图像的初始状态useEffect
钩子被调用,fetch 函数用于调用 meme API 并使用setAllMemeImages
. 一个空的依赖数组表示使用useEffect
hook调用了一次 meme API- 声明
handleClick
单击按钮时获取新图像的函数。此函数从从 meme API 获取并存储在状态中的所有图像 URL 的列表中随机生成一个 URLallMemeImages
。在这个函数中,setMemeData
用于在每次点击时重新渲染组件,这使得图像在屏幕上变为另一个图像
要在浏览器上显示应用程序,请在文件Meme.js
中导入文件App.js
,如下所示。
//App.js
import React from 'react'
import Meme from './Meme.js';
const App =()=> {
return (
<Meme />
)
}
export default App;
此时,您的应用程序应如下所示:
动图
结论
本文讨论useEffect
钩子以及如何在 React 应用程序中使用它来调用 API 端点。它解释了 hook 的默认行为useEffect
以及如何在使用 hook 时防止无限循环useEffect
。
按照以下资源了解有关useEffect
挂钩的更多信息。
资源
原文链接:https://juejin.cn/post/7218347355505901626 作者:愚z