react中useEffect函數(shù)的詳細(xì)用法(最新推薦)
1、函數(shù)介紹
useEffect
是 React 中的一個 Hook,用于在函數(shù)組件中處理副作用(如數(shù)據(jù)獲取、訂閱、手動更改 DOM 等)。與類組件中的生命周期方法(如 componentDidMount
、componentDidUpdate
和 componentWillUnmount
)類似,useEffect
讓你在函數(shù)組件中完成相同的操作。( from chatGPT)
簡單來說,useEffect屬于組件的生命周期方法。在組件不同的生命周期,我們可以通過useEffect函數(shù)來控制執(zhí)行過程。 那么什么是組件的生命周期呢?
2.組件的生命周期
在 React 中,組件的生命周期分為三個主要階段:掛載(Mounting)、更新(Updating)和卸載(Unmounting)。掛載和渲染是關(guān)鍵的生命周期階段,理解它們對于有效地使用 React 至關(guān)重要。
2.1 掛載(Mounting)
載是指組件第一次被插入到 DOM 中的過程。掛載階段包括以下步驟:
- 構(gòu)造函數(shù)(Constructor):組件的構(gòu)造函數(shù)被調(diào)用。如果你在類組件中定義了構(gòu)造函數(shù),那么它會在組件實(shí)例化時首先被調(diào)用。
getDerivedStateFromProps
(靜態(tài)方法):在初始化和更新期間調(diào)用,允許組件基于輸入的 props 來更新狀態(tài)。它是一個靜態(tài)方法,不能訪問組件實(shí)例。render
:渲染方法被調(diào)用。它返回要渲染的元素(通常是 JSX)。componentDidMount
:組件已經(jīng)被掛載到 DOM 中,此時可以執(zhí)行一些副作用操作,比如數(shù)據(jù)獲取、訂閱事件等。
2.2 渲染和更新
渲染(Rendering)
渲染是指組件根據(jù)其當(dāng)前狀態(tài)和屬性生成要顯示的元素。每次組件的狀態(tài)或?qū)傩园l(fā)生變化時,渲染過程都會被觸發(fā)。渲染階段包括:
render
方法(類組件):被調(diào)用以生成虛擬 DOM 結(jié)構(gòu)。- 函數(shù)組件本身:被調(diào)用以生成虛擬 DOM 結(jié)構(gòu)。
在每次狀態(tài)或?qū)傩宰兓瘯r,組件會重新渲染。React 將對比虛擬 DOM(使用 Diff 算法)并更新實(shí)際 DOM 以反映變化。
更新(Updating)
更新是指組件的狀態(tài)或?qū)傩园l(fā)生變化并重新渲染的過程。更新階段包括以下步驟:
getDerivedStateFromProps
(靜態(tài)方法):同掛載階段一樣,在屬性變化時調(diào)用。shouldComponentUpdate
:決定組件是否應(yīng)該重新渲染。返回true
表示重新渲染,返回false
表示跳過更新。render
:渲染方法被調(diào)用以生成新的虛擬 DOM 結(jié)構(gòu)。getSnapshotBeforeUpdate
:在 DOM 更新之前被調(diào)用,返回的值將作為componentDidUpdate
的第三個參數(shù)。componentDidUpdate
:組件更新并重新渲染到 DOM 之后調(diào)用,可執(zhí)行副作用操作。
2.3 卸載(Unmounting)
卸載是指組件被移出 DOM 的過程。卸載階段只包括一個方法:
componentWillUnmount
:組件即將卸載時調(diào)用,可以在這里執(zhí)行清理操作,例如取消訂閱、清除定時器等。
2.4 總結(jié)
- 掛載:組件第一次被插入到 DOM 中時執(zhí)行。類組件中使用
componentDidMount
,函數(shù)組件中使用useEffect
(空依賴數(shù)組)。 - 渲染:每次組件的狀態(tài)或?qū)傩宰兓瘯r,都會重新生成虛擬 DOM 并更新實(shí)際 DOM。
- 更新:狀態(tài)或?qū)傩宰兓鸾M件重新渲染。類組件中使用
componentDidUpdate
,函數(shù)組件中使用useEffect
(依賴數(shù)組)。 - 卸載:組件被移出 DOM 時執(zhí)行。類組件中使用
componentWillUnmount
,函數(shù)組件中通過useEffect
的清理函數(shù)處理。
3、函數(shù)的基本用法
有了對組件生命周期的認(rèn)識,那么就可以利用useEffect函數(shù)根據(jù)組件不同的生命周期階段來執(zhí)行不同的方法。比如:
- 有的方法只希望在執(zhí)行一次,即在組件掛載的時候執(zhí)行一次就夠了,后面也不需要再次執(zhí)行
- 有的方法希望在組件每次渲染(元素有更新)的時候都執(zhí)行
- 有的方法希望在某個依賴的變量發(fā)生變化時才會執(zhí)行
- 有的方法希望在組件卸載(頁面退出的)的時候執(zhí)行
上面的執(zhí)行過程都都可以通過useEffect方法做到。
3.1 用法示例
import React, { useState, useEffect } from 'react'; function ExampleComponent() { const [count, setCount] = useState(0); useEffect(() => { // 這里的代碼相當(dāng)于 componentDidMount 和 componentDidUpdate document.title = `You clicked ${count} times`; // 如果需要清理,可以返回一個函數(shù) return () => { // 這里的代碼相當(dāng)于 componentWillUnmount console.log('Cleaning up...'); }; }, [count]); // 依賴數(shù)組 return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}>Click me</button> </div> ); } export default ExampleComponent;
3.2 用法說明
副作用的執(zhí)行:
useEffect
的第一個參數(shù)是一個函數(shù),它在組件渲染后執(zhí)行。可以在這個函數(shù)內(nèi)進(jìn)行副作用操作。- 如果需要清理副作用,可以在這個函數(shù)中返回一個函數(shù),這個返回的函數(shù)會在組件卸載或副作用重新執(zhí)行前調(diào)用。
依賴數(shù)組:
useEffect
的第二個參數(shù)是一個依賴數(shù)組(可以依賴多個變量),表示副作用依賴的變量。當(dāng)依賴數(shù)組中的任何一個變量發(fā)生變化時,副作用函數(shù)會重新執(zhí)行。- 如果依賴數(shù)組為空(
[]
),副作用函數(shù)只會在組件掛載和卸載時執(zhí)行一次,類似于componentDidMount
和componentWillUnmount
。 - 如果不傳依賴數(shù)組,副作用函數(shù)會在每次組件渲染后執(zhí)行,類似于
componentDidUpdate
。
3.3 使用規(guī)則
- 在組件頂層調(diào)用:只能在 React 函數(shù)組件或自定義 Hook 的頂層調(diào)用
useEffect
,不要在循環(huán)、條件或嵌套函數(shù)中調(diào)用。 - 依賴數(shù)組:確保正確設(shè)置依賴數(shù)組,以避免不必要的副作用執(zhí)行或缺少必要的更新。
到此這篇關(guān)于react中useEffect函數(shù)的詳細(xì)用法的文章就介紹到這了,更多相關(guān)react useEffect函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React如何使用axios請求數(shù)據(jù)并把數(shù)據(jù)渲染到組件
這篇文章主要介紹了React如何使用axios請求數(shù)據(jù)并把數(shù)據(jù)渲染到組件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08react+react-beautiful-dnd實(shí)現(xiàn)代辦事項(xiàng)思路詳解
這篇文章主要介紹了react+react-beautiful-dnd實(shí)現(xiàn)代辦事項(xiàng),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06React語法中設(shè)置TS校驗(yàn)規(guī)則的步驟詳解
這篇文章主要給大家介紹了React語法中如何設(shè)置TS校驗(yàn)規(guī)則,文中有詳細(xì)的代碼示例供大家參考,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-10-10關(guān)于React動態(tài)修改元素樣式的三種方式
這篇文章主要介紹了關(guān)于React動態(tài)修改元素樣式的三種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08React中使用Axios發(fā)起POST請求提交文件方式
這篇文章主要介紹了React中使用Axios發(fā)起POST請求提交文件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02