最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何解決React useEffect鉤子帶來的無限循環(huán)問題

 更新時間:2022年07月07日 11:26:39   作者:前端修羅場  
本文主要介紹了解決React useEffect鉤子帶來的無限循環(huán)問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

React的useEffect Hook可以讓用戶處理應(yīng)用程序的副作用。例如:

  • 從網(wǎng)絡(luò)獲取數(shù)據(jù):應(yīng)用程序通常在第一次加載時獲取并填充數(shù)據(jù)。這可以通過useEffect函數(shù)實(shí)現(xiàn)
  • 操作UI:應(yīng)用程序應(yīng)該響應(yīng)按鈕點(diǎn)擊事件(例如,打開一個菜單)
  • 設(shè)置或結(jié)束計時器:如果某個變量達(dá)到預(yù)定義值,則內(nèi)置計時器應(yīng)自行停止或啟動

盡管useEffect Hook在React生態(tài)系統(tǒng)中很常見,但它需要時間來掌握。因此,許多新手開發(fā)人員在配置他們的useEffect函數(shù)時,會導(dǎo)致無限循環(huán)問題。在本文中,您將了解不同場景下帶來的無限循環(huán)問題以及如何解決它們。

這是我們今天要學(xué)習(xí)的內(nèi)容:

是什么導(dǎo)致無限循環(huán)以及如何解決它們:

  • 在依賴項(xiàng)數(shù)組中不傳遞依賴項(xiàng)
  • 使用函數(shù)作為依賴項(xiàng)
  • 使用數(shù)組作為依賴項(xiàng)
  • 使用對象作為依賴項(xiàng)
  • 傳遞不正確的依賴項(xiàng)

什么導(dǎo)致的無限循環(huán)以及如何解決它們

在依賴項(xiàng)數(shù)組中不傳遞依賴項(xiàng)

如果您的useEffect函數(shù)不包含任何依賴項(xiàng),則會出現(xiàn)一個無限循環(huán)。

例如,看看下面的代碼:

function App() {
  const [count, setCount] = useState(0); //初始化值
  useEffect(() => {
    setCount((count) => count + 1); 
  }); //無依賴項(xiàng)
  return (
    <div className="App">
      <p> value of count: {count} </p>
    </div>
  );
}

如果沒有依賴關(guān)系,則默認(rèn)在每個更新周期上觸發(fā)useEffect。因此,這里的應(yīng)用程序?qū)⒃?strong>每次渲染時執(zhí)行setCount函數(shù)。因此,這會導(dǎo)致一個無限循環(huán):

gif在這里插入圖片描述

是什么導(dǎo)致了這個問題?讓我們一步一步來分析這個問題:

  • 在第一次渲染時,React會檢查count的值。在這里,由于count為0,程序執(zhí)行useEffect函數(shù)
  • 稍后,useEffect調(diào)用setCount方法并更新count的值
  • 之后,React重新呈現(xiàn)UI以顯示count的更新值
  • 此外,由于useEffect在每個呈現(xiàn)周期中運(yùn)行,它將重新調(diào)用setCount函數(shù)
  • 由于上述步驟發(fā)生在每一個渲染,這導(dǎo)致你的應(yīng)用程序崩潰

如何解決這個問題

為了緩解這個問題,我們必須使用依賴數(shù)組,告訴React只有在特定值更新時才調(diào)用useEffect。

下一步,像這樣附加一個空白數(shù)組作為依賴項(xiàng):

useEffect(() => {
  setCount((count) => count + 1);
}, []); //empty array as second argument.

這告訴React在第一次裝載時執(zhí)行setCount函數(shù)。

image

使用函數(shù)作為依賴項(xiàng)

如果你把一個方法傳入你的useEffect依賴數(shù)組,React會拋出一個錯誤,表明你有一個無限循環(huán):

function App() {
  const [count, setCount] = useState(0);

  function logResult() {
    return 2 + 2;
  }
  useEffect(() => {
    setCount((count) => count + 1);
  }, [logResult]); // 函數(shù)作為依賴項(xiàng)
  return (
    <div className="App">
      <p> value of count: {count} </p>
    </div>
  );
}

在這段代碼中,我們將logResult方法傳遞給useEffect數(shù)組。理論上,React只需要在第一次渲染時增加count的值。

image

是什么導(dǎo)致了這個問題?

  • 要記住的一件事是,useEffect使用了一個叫做淺比較的概念。它這樣做是為了驗(yàn)證依賴項(xiàng)是否已經(jīng)更新
  • 這里的問題是,在每次呈現(xiàn)期間,React都會重新定義logResult的引用
  • 因此,這將在每個循環(huán)中重新觸發(fā)useEffect函數(shù)
  • 因此,React會調(diào)用setCount鉤子,直到應(yīng)用程序遇到更新深度錯誤。這會給程序帶來錯誤和不穩(wěn)定性

如何解決這個問題

一個解決方案是使用useCallback鉤子。這允許開發(fā)人員記住他們的函數(shù),從而確保引用值保持不變。由于這個參考值是穩(wěn)定的,React不應(yīng)該無限地重新渲染UI:

const logResult = useCallback(() => {
  return 2 + 2;
}, []); // logResult是緩存的
useEffect(()=> {
  setCount((count)=> count+1);
},[logResult]); //沒有無限循環(huán)錯誤,因?yàn)閘ogResult引用保持不變。

結(jié)果:

image

使用數(shù)組作為依賴項(xiàng)

將數(shù)組變量傳遞給依賴項(xiàng)也會運(yùn)行一個無限循環(huán)??紤]下面的代碼示例:

const [count, setCount] = useState(0); //初始值為0。
const myArray = ["one", "two", "three"];

useEffect(() => {
  setCount((count) => count + 1); // 和前面一樣,增加Count的值
}, [myArray]); // 將數(shù)組變量傳遞給依賴項(xiàng)

在這個塊中,我們將myArray變量傳入依賴參數(shù)。

gif

是什么導(dǎo)致了這個問題?

既然myArray的值在整個程序中都沒有改變,為什么我們的代碼會多次觸發(fā)useEffect ?

  • 在這里,回想一下React使用淺比較來檢查依賴項(xiàng)的引用是否發(fā)生了變化。
  • 由于對myArray的引用在每次渲染時都在變化,useEffect將觸發(fā)setCount回調(diào)
  • 因此,由于myArray的引用值不穩(wěn)定,React將在每個渲染周期中調(diào)用useEffect。最終,這會導(dǎo)致應(yīng)用程序崩潰

如何解決這個問題

為了解決這個問題,我們可以使用useRefHook這將返回一個可變對象,確保引用不會改變:

const [count, setCount] = useState(0);
//提取“current”屬性并給它賦值
const { current: myArray } = useRef(["one", "two", "three"]);

useEffect(() => {
  setCount((count) => count + 1);
}, [myArray]); //依賴值是穩(wěn)定的,所以沒有無限循環(huán)

將對象作為依賴項(xiàng)傳遞

在useEffect依賴數(shù)組中使用對象也會導(dǎo)致無限循環(huán)問題。

考慮下面的代碼:

const [count, setCount] = useState(0);
const person = { name: "Rue", age: 17 }; //創(chuàng)建一個對象
useEffect(() => {
  // 每次增加count的值
  // person的值發(fā)生了變化
  setCount((count) => count + 1);
}, [person]); // 依賴項(xiàng)數(shù)組包含一個對象作為參數(shù)
return (
  <div className="App">
    <p> Value of {count} </p>
  </div>
);

控制臺的結(jié)果表明程序是無限循環(huán)的:

img

是什么導(dǎo)致了這個問題?

  • 和之前一樣,React使用淺比較來檢查person的參考值是否發(fā)生了變化
  • 因?yàn)?strong>person對象的引用值在每次渲染時都會改變,所以React會重新運(yùn)行useEffect
  • 因此,在每個更新周期中調(diào)用setCount。這意味著我們現(xiàn)在有了一個無限循環(huán)

如何解決這個問題

那么我們?nèi)绾谓鉀Q這個問題呢?

這就是usemmo的用武之地。**當(dāng)依賴關(guān)系發(fā)生變化時,這個鉤子會計算一個記憶的值。**除此之外,因?yàn)槲覀冇涀×艘粋€變量,這確保了狀態(tài)的引用值在每次渲染期間不會改變:

// 使用usemo創(chuàng)建一個對象
const person = useMemo(
  () => ({ name: "Rue", age: 17 }),
  [] //沒有依賴關(guān)系,所以值不會改變
);
useEffect(() => {
  setCount((count) => count + 1);
}, [person]);

傳遞不正確的依賴項(xiàng)

如果將錯誤的變量傳遞給useEffect函數(shù),React將拋出一個錯誤。

下面是一個簡單的例子:

const [count, setCount] = useState(0);

useEffect(() => {
  setCount((count) => count + 1);
}, [count]); //注意,我們將count傳遞給了這個數(shù)組。

return (
  <div className="App">
    <button onClick={() => setCount((count) => count + 1)}>+</button>
    <p> Value of count{count} </p>
  </div>
);

gif

是什么導(dǎo)致了這個問題?

  • 在上面的代碼中,我們告訴在useEffect方法中更新count的值
  • 此外,注意我們也將count Hook傳遞給了它的依賴數(shù)組
  • 這意味著每次count值更新時,React都會調(diào)用useEffect
  • 因此,useEffect鉤子調(diào)用setCount,從而再次更新count
  • 因此,React現(xiàn)在在一個無限循環(huán)中運(yùn)行我們的函數(shù)

如何解決這個問題

要擺脫無限循環(huán),只需像這樣使用一個空的依賴數(shù)組:

const [count, setCount] = useState(0);
// 只有在組件首次掛載時才更新'count'的值
useEffect(() => {
  setCount((count) => count + 1);
}, []);

這將告訴React在第一次渲染時運(yùn)行useEffect。

gif

結(jié)尾

盡管React Hooks是一個簡單的概念,但是在將它們整合到項(xiàng)目中時,仍然需要記住許多規(guī)則。這將確保您的應(yīng)用程序保持穩(wěn)定,優(yōu)化,并在生產(chǎn)過程中不拋出錯誤。

此外,最近發(fā)布的Create React App CLI也會在運(yùn)行時檢測和報告無限循環(huán)錯誤。這有助于開發(fā)人員在這些問題出現(xiàn)在生產(chǎn)服務(wù)器上之前發(fā)現(xiàn)并解決這些問題。

img

 到此這篇關(guān)于如何解決React useEffect鉤子帶來的無限循環(huán)問題的文章就介紹到這了,更多相關(guān)React useEffect鉤子無限循環(huán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React實(shí)現(xiàn)雙滑塊交叉滑動

    React實(shí)現(xiàn)雙滑塊交叉滑動

    這篇文章主要為大家詳細(xì)介紹了React實(shí)現(xiàn)雙滑塊交叉滑動,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • React+Typescript項(xiàng)目環(huán)境搭建并使用redux環(huán)境的詳細(xì)過程

    React+Typescript項(xiàng)目環(huán)境搭建并使用redux環(huán)境的詳細(xì)過程

    這篇文章主要介紹了React+Typescript項(xiàng)目環(huán)境搭建并使用redux環(huán)境的詳細(xì)過程,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • 使用React-Router時出現(xiàn)的錯誤及解決

    使用React-Router時出現(xiàn)的錯誤及解決

    這篇文章主要介紹了使用React-Router時出現(xiàn)的錯誤及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • React實(shí)現(xiàn)復(fù)雜搜索表單的展開收起功能

    React實(shí)現(xiàn)復(fù)雜搜索表單的展開收起功能

    本節(jié)對于需要展開收起效果的查詢表單進(jìn)行概述,主要涉及前端樣式知識。對React實(shí)現(xiàn)復(fù)雜搜索表單的展開-收起功能感興趣的朋友一起看看吧
    2021-09-09
  • react PropTypes校驗(yàn)傳遞的值操作示例

    react PropTypes校驗(yàn)傳遞的值操作示例

    這篇文章主要介紹了react PropTypes校驗(yàn)傳遞的值操作,結(jié)合實(shí)例形式分析了react PropTypes針對傳遞的值進(jìn)行校驗(yàn)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2020-04-04
  • react基于Ant Desgin Upload實(shí)現(xiàn)導(dǎo)入導(dǎo)出

    react基于Ant Desgin Upload實(shí)現(xiàn)導(dǎo)入導(dǎo)出

    本文主要介紹了react基于Ant Desgin Upload實(shí)現(xiàn)導(dǎo)入導(dǎo)出,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • react中的useEffect()的使用詳解

    react中的useEffect()的使用詳解

    useEffect()是react中的hook函數(shù),作用是用于創(chuàng)建由渲染本身引起的操作,介紹了依賴項(xiàng)數(shù)組不同的區(qū)別,對react useEffect()使用相關(guān)知識感興趣的朋友一起看看吧
    2024-05-05
  • React特征Form?單向數(shù)據(jù)流示例詳解

    React特征Form?單向數(shù)據(jù)流示例詳解

    這篇文章主要為大家介紹了React特征Form?單向數(shù)據(jù)流示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 如何在React項(xiàng)目中引入字體文件并使用詳解

    如何在React項(xiàng)目中引入字體文件并使用詳解

    我們項(xiàng)目中通常會需要引入字體,所以下面這篇文章主要給大家介紹了關(guān)于如何在React項(xiàng)目中引入字體文件并使用的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • React Hook父組件如何獲取子組件的數(shù)據(jù)/函數(shù)

    React Hook父組件如何獲取子組件的數(shù)據(jù)/函數(shù)

    這篇文章主要介紹了React Hook父組件如何獲取子組件的數(shù)據(jù)/函數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評論

绍兴市| 吴川市| 康马县| 韶关市| 玉溪市| 社会| 灵寿县| 故城县| 西乌珠穆沁旗| 石狮市| 上饶市| 民县| 陵川县| 勐海县| 蒙阴县| 平陆县| 建始县| 东城区| 麻江县| 南陵县| 鄂温| 富宁县| 金寨县| 满洲里市| 阿巴嘎旗| 平南县| 海原县| 东阿县| 桐柏县| 赤水市| 定陶县| 京山县| 三都| 廉江市| 石屏县| 中卫市| 新干县| 四川省| 黄陵县| 陇川县| 富源县|