首頁 web前端 js教程 React:清理函數多久運行一次?

React:清理函數多久運行一次?

Nov 01, 2024 pm 12:50 PM

React: How Often Does a Cleanup Function Run?

具有狀態變數的 React 元件在這些變數更新時會觸發重新渲染。這是預期的,也是 React 的核心功能之一。此外,組件還提供清理功能,每次「卸載」組件時都會觸發該功能。但這個清理功能實際運作的頻率是多少?

嗯,正如我們將在本演示中探索的那樣,清理函數可以有多個觸發器,但一個常見的觸發器是當狀態變數連結到副作用時更新狀態變數。

簡而言之,如果您的 React 元件正在使用 useEffect 並遵循特定的狀態變量,讓我們看以下範例:

useEffect(() => {
  console.log("Page mounted");

  return () => {
    // cleanup function
    console.log("Page unmounted");
  };
}, [counter]);

每次更新計數器時都會呼叫清理函數。

當狀態變數更新時,React 會重新渲染元件,這表示它首先需要「刪除」它,然後再次「渲染」它。雖然虛擬 DOM 優化了哪些節點需要更新,但在邏輯層面,清理函數仍然會被呼叫。

在大多數情況下,這是可以接受的。但是,如果您的清理函數正在執行報告事件、刪除偵聽器等操作,請確保這是有意為之,因為清理函數將根據狀態變數被多次呼叫。

示範

讓我們看一下示範。

  • 在開發者工具中,開啟控制台。
  • 你會注意到兩個日誌:
Child mounted
Page mounted

React: How Often Does a Cleanup Function Run?

這表示頁面和子元件這兩個元件都已渲染。

  • 如果您還記得上面分享的程式碼片段,useEffect 與 counter 綁定在一起,當按一下第一個按鈕時,counter 會遞增。現在,它應該顯示:遞增 0。讓我們繼續單擊它。

  • 密切注意控制台並注意如何添加四個日誌:

Child unmounted
Page unmounted
Child mounted
Page mounted

React: How Often Does a Cleanup Function Run?

狀態變數 counter 已更新,並且由於有兩個 useEffect 掛鉤與 counter 綁定,這表示它們的清理函數已執行。請注意,對於 Page 元件,useEffect 與狀態變數相關聯,而對於 Child 元件,副作用與 prop 變數相關聯,其中來源仍然是相同的計數器狀態變數。

此外,您還可以看到「Flag Off」按鈕,它會更新另一個未連結到 useEffect 的狀態變數。這意味著點擊此按鈕不會觸發清理功能。

結論

清理函數在 React 中被大量使用,尤其是在元件「完成」後報告事情。但是,將 useEffect 綁定到狀態變數時要小心。如演示中所示,這會導致每次更新狀態變數時都會呼叫清理函數,這可能是意想不到的。

大多數時候,清理函數位於 useEffect 中,沒有任何狀態變數。

useEffect(() => {
  console.log("Page mounted");

  return () => {
    // cleanup function
    console.log("Page unmounted");
  };
}, [counter]);

一個元件中可以有多個 useEffect 鉤子。在這種情況下,您可以有一個對狀態變數做出反應,另一個用於設定清理函數。

Child mounted
Page mounted

為了回答這個問題,元件卸載時將會呼叫清理函數。當使用者導航到應用程式的另一個部分時,或者如果 useEffect 依賴狀態變量,那麼每當該狀態變數更新時,就會呼叫 N 次。

以上是React:清理函數多久運行一次?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Stock Market GPT

Stock Market GPT

人工智慧支援投資研究,做出更明智的決策

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

JavaScript實現點擊圖片切換效果:專業教程 JavaScript實現點擊圖片切換效果:專業教程 Sep 18, 2025 pm 01:03 PM

本文將介紹如何使用JavaScript實現點擊圖片切換的效果。核心思路是利用HTML5的data-*屬性存儲備用圖片路徑,並通過JavaScript監聽點擊事件,動態切換src屬性,從而實現圖片切換。本文將提供詳細的代碼示例和解釋,幫助你理解和掌握這種常用的交互效果。

如何使用JavaScript中的GeOlocation API獲取用戶的位置? 如何使用JavaScript中的GeOlocation API獲取用戶的位置? Sep 21, 2025 am 06:19 AM

首先檢查瀏覽器是否支持GeolocationAPI,若支持則調用getCurrentPosition()獲取用戶當前位置坐標,並通過成功回調獲取緯度和經度值,同時提供錯誤回調處理權限被拒、位置不可用或超時等異常,還可傳入配置選項以啟用高精度、設置超時時間和緩存有效期,整個過程需用戶授權並做好相應錯誤處理。

如何在JavaScript中使用setInterval創建重複間隔 如何在JavaScript中使用setInterval創建重複間隔 Sep 21, 2025 am 05:31 AM

要創建JavaScript中的重複間隔,需使用setInterval()函數,它會以指定毫秒數為間隔重複執行函數或代碼塊,例如setInterval(()=>{console.log("每2秒執行一次");},2000)會每隔2秒輸出一次消息,直到通過clearInterval(intervalId)清除,實際應用中可用於更新時鐘、輪詢服務器等場景,但需注意最小延遲限制、函數執行時間影響,並在不再需要時及時清除間隔以避免內存洩漏,特別是在組件卸載或頁面關閉前應清理,確保

JavaScript中DOM元素訪問的常見陷阱與解決方案 JavaScript中DOM元素訪問的常見陷阱與解決方案 Sep 15, 2025 pm 01:24 PM

本文旨在解決JavaScript中通過document.getElementById()獲取DOM元素時返回null的問題。核心在於理解腳本執行時機與DOM解析狀態。通過正確放置標籤或利用DOMContentLoaded事件,可以確保在元素可用時再嘗試訪問,從而有效避免此類錯誤。

NUXT 3組成API解釋了 NUXT 3組成API解釋了 Sep 20, 2025 am 03:00 AM

Nuxt3的CompositionAPI核心用法包括:1.definePageMeta用於定義頁面元信息,如標題、佈局和中間件,需在中直接調用,不可置於條件語句中;2.useHead用於管理頁面頭部標籤,支持靜態和響應式更新,需與definePageMeta配合實現SEO優化;3.useAsyncData用於安全地獲取異步數據,自動處理loading和error狀態,支持服務端和客戶端數據獲取控制;4.useFetch是useAsyncData與$fetch的封裝,自動推斷請求key,避免重複請

如何將文本複製到JavaScript中的剪貼板? 如何將文本複製到JavaScript中的剪貼板? Sep 18, 2025 am 03:50 AM

使用ClipboardAPI的writeText方法可複製文本到剪貼板,需在安全上下文和用戶交互中調用,支持現代瀏覽器,舊版可用execCommand降級處理。

JavaScript中數字格式化:使用toFixed()方法保留固定小數位 JavaScript中數字格式化:使用toFixed()方法保留固定小數位 Sep 16, 2025 am 11:57 AM

本教程詳細講解如何在JavaScript中將數字格式化為固定兩位小數的字符串,即使是整數也能顯示為"#.00"的形式。我們將重點介紹Number.prototype.toFixed()方法的使用,包括其語法、功能、示例代碼以及需要注意的關鍵點,如其返回類型始終為字符串。

如何在JavaScript中創建多行字符串? 如何在JavaScript中創建多行字符串? Sep 20, 2025 am 06:11 AM

thebestatoreateamulti-linestlinginjavascriptsisisingsistisingtemplatalalswithbacktticks,whatpreserveticks,whatpreservereakeandeexactlyaswrite。

See all articles