理解 Reactjs 中的 useCallback
useCallback 鉤子會記住函數本身,而不是它的回傳值。 useCallback 快取函數引用
元件內部宣告的函數會在每次渲染時重新創建,類似於變數。不同之處在於,它每次都會使用不同的參考進行渲染。所以,
- 依賴此函數的 useEffect 將在每次渲染時再次執行。
- 子組件也會發生類似的情況。
依賴此函數的 useEffect 將在每次渲染時再次執行:
import React, { useState, useEffect, useCallback } from 'react'; // Parent Component const ParentComponent = () => { const [count, setCount] = useState(0); const [text, setText] = useState(""); // Function declared inside the component const handleClick = () => { setCount(count + 1); }; // useEffect depending on handleClick useEffect(() => { console.log("handleClick changed, running useEffect"); }, [handleClick]); return ( <div> <button onClick={handleClick}>Increment Count</button> <p>Count: {count}</p> <ChildComponent handleClick={handleClick} /> </div> ); }; // Child Component const ChildComponent = React.memo(({ handleClick }) => { console.log("ChildComponent re-rendered"); return <button onClick={handleClick}>Child Increment</button>; }); export default ParentComponent;
子組件也會發生類似的情況:
當我們將一個具有昂貴或「慢」渲染邏輯的元件作為另一個元件的子元件時,每次父元件渲染時,其所有子元件也會重新渲染。
為了防止這些不必要的重新渲染,我們可以使用 React.memo。這個高階元件會快取子元件,確保它僅在其 props 實際變更時才重新渲染。然而,當函數作為 props 傳遞時,有一個微妙的問題,這會導致子程序重新渲染,即使它不應該重新渲染。
函數所引用的問題
想像一下我們有一個 SlowComponent 作為 App 的子元件。在 App 中,我們有一個狀態會在按鈕點擊時發生變化,從而觸發 App 的重新渲染。儘管我們沒有更改 SlowComponent 的 props,但它仍然會在每次點擊時重新渲染。
為什麼?在每次渲染時,handleClick 函數都會使用新的參考重新創建,React 將其解釋為更改後的 prop,導致 SlowComponent 重新渲染。為了解決這個問題,我們使用 useCallback 鉤子來跨渲染快取函數的參考。
使用 useCallback 的解決方案
透過將handleClick包裝在useCallback中,我們告訴React僅在特定依賴項發生變化時重新建立它。文法如下:
const cachedFn = useCallback(fn, [dependencies]);
- fn:這是您要快取的函數定義。它可以接受參數並傳回任何值。
- 依賴項:這是一個依賴項數組。如果任何依賴項發生變化,React 將重新建立 fn。 在第一次渲染時,React 會建立並快取該函數。在後續渲染中,只要依賴項沒有改變,就會傳回快取的函數,確保它有一個穩定的參考。
在我們的範例中應用 useCallback
讓我們看看如何使用 useCallback 來最佳化我們的 App 元件:
import React, { useState, useCallback } from "react"; const App = () => { const [count, setCount] = useState(0); const [value, setValue] = useState(""); // Wrapping handleClick with useCallback to cache its reference const handleClick = useCallback(() => { setValue("Kunal"); }, [setValue]); return ( <div> <button onClick={() => setCount(count + 1)}>Increment Count</button> <p>Count: {count}</p> <SlowComponent handleClick={handleClick} /> </div> ); }; const SlowComponent = React.memo(({ handleClick }) => { // Intentially making the component slow for (let i = 0; i < 1000000000; i++) {} console.log("SlowComponent re-rendered"); return <button onClick={handleClick}>Click me in SlowComponent</button>; }); export default App;
何時使用 useCallback
- 當您為元件內的元素定義了事件處理程序時,請將它們包裝在 useCallback 中,以避免不必要地重新建立事件處理程序。
- 當您在 useEffect 中呼叫函數時,通常會將該函數作為依賴項傳遞。為了避免在每次渲染時不必要地使用 useEffect,請將函數定義包裝在 useCallback 中。
- 如果您正在編寫自訂鉤子,並且它會傳回一個函數,建議將其包裝在 useCallback 中。因此,用戶無需擔心優化鉤子 - 相反,他們可以專注於自己的程式碼。
以上是理解 Reactjs 中的 useCallback的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

探索前端中類似VSCode的面板拖拽調整功能的實現在前端開發中,如何實現類似於VSCode...
