hooks中useEffect()使用案例詳解
常見使用:
獲取數(shù)據(jù)案例:
import React, { useState, useEffect } from 'react';
import axios from 'axios';
function App() {
const [data, setData] = useState({ hits: [] });
useEffect(() => {
const fetchData = async () => {
const result = await axios(
'https://hn.algolia.com/api/v1/search?query=redux',
);
setData(result.data);
};
fetchData();
}, []);
return (
<ul>
{data.hits.map(item => (
<li key={item.objectID}>
<a href={item.url}>{item.title}</a>
</li>
))}
</ul>
);
}
export default App;
上面例子中,useState()用來生成一個狀態(tài)變量(data),保存獲取的數(shù)據(jù);useEffect()的副效應(yīng)函數(shù)內(nèi)部有一個 async 函數(shù),用來從服務(wù)器異步獲取數(shù)據(jù)。拿到數(shù)據(jù)以后,再用setData()觸發(fā)組件的重新渲染。
由于獲取數(shù)據(jù)只需要執(zhí)行一次,所以上例的useEffect()的第二個參數(shù)為一個空數(shù)組
useEffect() 的第二個參數(shù)說明
有時(shí)候,我們不希望useEffect()每次渲染都執(zhí)行,這時(shí)可以使用它的第二個參數(shù),使用一個數(shù)組指定副效應(yīng)函數(shù)的依賴項(xiàng),只有依賴項(xiàng)發(fā)生變化,才會重新渲染。
function Welcome(props) {
useEffect(() => {
document.title = `Hello, ${props.name}`;
}, [props.name]);
return <h1>Hello, {props.name}</h1>;
}
上面例子中,useEffect()的第二個參數(shù)是一個數(shù)組,指定了第一個參數(shù)(副效應(yīng)函數(shù))的依賴項(xiàng)(props.name)。只有該變量發(fā)生變化時(shí),副效應(yīng)函數(shù)才會執(zhí)行。如果第二個參數(shù)是一個空數(shù)組,就表明副效應(yīng)參數(shù)沒有任何依賴項(xiàng)。因此,副效應(yīng)函數(shù)這時(shí)只會在組件加載進(jìn)入 DOM 后執(zhí)行一次,后面組件重新渲染,就不會再次執(zhí)行。這很合理,由于副效應(yīng)不依賴任何變量,所以那些變量無論怎么變,副效應(yīng)函數(shù)的執(zhí)行結(jié)果都不會改變,所以運(yùn)行一次就夠了。
useEffect() 第一個函數(shù)參數(shù)的返回值
副效應(yīng)是隨著組件加載而發(fā)生的,那么組件卸載時(shí),可能需要清理這些副效應(yīng)。
useEffect()允許返回一個函數(shù),在組件卸載時(shí),執(zhí)行該函數(shù),清理副效應(yīng)。如果不需要清理副效應(yīng),useEffect()就不用返回任何值。
useEffect(() => {
const subscription = props.source.subscribe();
return () => {
subscription.unsubscribe();
};
}, [props.source]);
上面例子中,useEffect()在組件加載時(shí)訂閱了一個事件,并且返回一個清理函數(shù),在組件卸載時(shí)取消訂閱。
實(shí)際使用中,由于副效應(yīng)函數(shù)默認(rèn)是每次渲染都會執(zhí)行,所以清理函數(shù)不僅會在組件卸載時(shí)執(zhí)行一次,每次副效應(yīng)函數(shù)重新執(zhí)行之前,也會執(zhí)行一次,用來清理上一次渲染的副效應(yīng)。
useEffect() 的注意點(diǎn)
使用useEffect()時(shí),有一點(diǎn)需要注意。如果有多個副效應(yīng),應(yīng)該調(diào)用多個useEffect(),而不應(yīng)該合并寫在一起。
錯誤寫法:
function App() {
const [varA, setVarA] = useState(0);
const [varB, setVarB] = useState(0);
useEffect(() => {
const timeoutA = setTimeout(() => setVarA(varA + 1), 1000);
const timeoutB = setTimeout(() => setVarB(varB + 2), 2000);
return () => {
clearTimeout(timeoutA);
clearTimeout(timeoutB);
};
}, [varA, varB]);
return <span>{varA}, {varB}</span>;
}
上面的例子是錯誤的寫法,副效應(yīng)函數(shù)里面有兩個定時(shí)器,它們之間并沒有關(guān)系,其實(shí)是兩個不相關(guān)的副效應(yīng),不應(yīng)該寫在一起。正確的寫法是將它們分開寫成兩個useEffect()。
正確寫法:
function App() {
const [varA, setVarA] = useState(0);
const [varB, setVarB] = useState(0);
useEffect(() => {
const timeout = setTimeout(() => setVarA(varA + 1), 1000);
return () => clearTimeout(timeout);
}, [varA]);
useEffect(() => {
const timeout = setTimeout(() => setVarB(varB + 2), 2000);
return () => clearTimeout(timeout);
}, [varB]);
return <span>{varA}, {varB}</span>;
}
到此這篇關(guān)于hooks中useEffect()使用總結(jié)的文章就介紹到這了,更多相關(guān)hooks useEffect()使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React實(shí)現(xiàn)文件分片上傳和下載的方法詳解
在當(dāng)今的前端開發(fā)中,處理文件流操作已經(jīng)成為一個常見的需求,無論是上傳、下載、讀取、展示還是其他的文件處理操作,都需要高效且可靠地處理二進(jìn)制數(shù)據(jù),本文將深入探討如何使用 React 實(shí)現(xiàn)文件分片上傳和下載,并介紹相關(guān)的基本概念和技術(shù),需要的朋友可以參考下2023-08-08
React Native Popup實(shí)現(xiàn)示例
本文主要介紹了React Native Popup實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
React18的useEffect執(zhí)行兩次如何應(yīng)對
這篇文章主要給大家介紹了關(guān)于React18的useEffect執(zhí)行兩次如何應(yīng)對的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用React具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
手把手教您實(shí)現(xiàn)react異步加載高階組件
這篇文章主要介紹了手把手教您實(shí)現(xiàn)react異步加載高階組件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
深入理解React中es6創(chuàng)建組件this的方法
this的本質(zhì)可以這樣說,this跟作用域無關(guān)的,只跟執(zhí)行上下文有關(guān)。接下來通過本文給大家介紹React中es6創(chuàng)建組件this的方法,非常不錯,感興趣的朋友一起看看吧2016-08-08
react router 4.0以上的路由應(yīng)用詳解
本篇文章主要介紹了react router 4.0以上的路由應(yīng)用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09

