」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > React 中的 Prop Drilling:定義與範例

React 中的 Prop Drilling:定義與範例

發佈於2024-08-21
瀏覽:531

Prop Drilling in React: definition and examples

是否曾經發現自己處於需要將一些資料獲取到深埋在 React 應用程式中的元件中的情況?你已經在較高的層次上獲得了這條重要的訊息,但你的組件位於樹的下方,現在你必須透過一堆層傳遞道具才能到達那裡。這就是我們所說的「螺旋槳鑽井」。

您首先將訊息作為 prop 從父元件傳送到其直接子元件。然後,該子級將相同的訊息傳遞給自己的子級,依此類推,一層一層地傳遞,直到訊息最終到達真正需要它的元件。

因此,如果您正在處理在組件樹中移動的大量 props 並且感覺有點過頭了,那麼您可能正在處理 prop 鑽探。讓我們深入了解它是什麼以及為什麼值得尋找替代方法來處理數據。

什麼是支柱鑽井?

道具鑽探,有時稱為“線程道具”或“組件鏈接”,是使用道具從父組件通過一系列嵌套子組件傳遞資料的方法。

當您需要透過多個層級的元件發送道具以將其傳送到需要它的深層嵌套子元件時,就會發生這種情況。鏈中的每個中間組件都必須轉送該 prop,即使它不直接使用它。

課堂隱喻

想像一下,一位老師需要與一長排課桌上的最後一個學生分享一則重要訊息。老師沒有直接傳遞訊息,而是交給第一位學生。然後,該學生將其傳遞給下一個學生,依此類推,該行中的每個學生都將訊息轉發給下一個學生,直到訊息最終到達最後一個學生。在這種情況下,每個學生都充當中介,確保訊息從源頭傳輸到最終接收者。這個過程反映了編程中的道具鑽探,其中資料在到達實際需要的組件之前通過多層組件傳遞。

讓我們在程式碼範例中看看:

// Parent Component (Teacher)
function Teacher() {
  const messageToLastStudent = "Helo, Last Student!";
  return (
    
  );
}

// Child Component (First Student)
function FirstStudent({ message }) {
  // The message is passed directly as prop, without be used here.
  return (
    
  );
}

// Grandson Component (Last Student)
function LastStudent({ message }) {
  return 

{message}

; // Here the message is finally used. }

支柱鑽井的困難

當你的應用程式的元件樹小而簡單時,Prop Drill 非常方便。將資料從父級傳遞給幾個嵌套的子級很容易。但隨著你的應用程式的成長,你可能會遇到一些問題:

  • 複雜性代碼:道具鑽探會增加複雜性和額外的樣板,尤其是在大型組件樹中。隨著元件的嵌套程度越來越高,追蹤 prop 流變得更加困難,並且會使程式碼庫變得混亂。

  • 對效能的影響:將資料傳遞到多層元件可能會對效能產生負面影響,特別是在處理大量資料時。這是因為鏈中的每個元件在屬性變更時都需要再次重新渲染,這會導致不必要的重新渲染。

解決支柱鑽井問題

但一切並沒有失去!我們有有效的方法來避免支柱鑽井並保持應用性能:

  • Context API:React 中的 Context API 允許您直接跨組件共享數據,而無需在組件樹的每個級別傳遞 props,從而幫助避免 prop 鑽探。透過使用 React.createContext 和 Context.Provider,您可以讓資料可供提供者中的任何元件使用,從而無需將 props 傳遞到多個層。這簡化了資料管理並降低了元件層次結構的複雜性。

  • 狀態管理庫
    狀態管理庫透過為應用程式資料提供集中儲存來幫助避免道具鑽探。 Redux、MobX 和 Zustand 等函式庫管理全域狀態,允許元件存取和更新數據,而無需在每個層級傳遞 props。例如,Redux 使用全域儲存和連接或 useSelector 掛鉤將元件連接到狀態,使資料存取變得簡單並減少深層 prop 傳遞的需要。

  • 高階組件 (HOC):
    高階組件 (HOC) 透過使用附加功能和資料包裝組件來幫助避免鑽探。 HOC 取得一個元件並傳回一個有註入 props 或增強行為的新元件。這允許您向深度嵌套的組件提供資料或功能,而無需透過每一層傳遞 props。例如,HOC 可以包裝元件以向其提供使用者身份驗證數據,從而簡化資料存取並減少 prop 傳遞。

結論

簡而言之,道具鑽探可以是透過幾層元件傳遞資料的快速解決方案,但隨著應用程式的成長,它很快就會變成一團混亂。雖然它適用於較小的應用程序,但在較大的專案中可能會導致程式碼混亂和維護麻煩。幸運的是,有 Context API、狀態管理庫和高階元件等工具可以幫助您避開 prop 鑽探陷阱並保持程式碼庫乾淨且易於管理。因此,下次您處理道具時,請考慮這些替代方案,以保持事情順利進行!

讓我們共創未來! ?

版本聲明 本文轉載於:https://dev.to/ericlefyson/prop-drilling-in-react-definition-and-examples-1395?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    postgresql:為每個唯一標識符提取最後一行,在Postgresql中,您可能需要遇到與在數據庫中的每個不同標識相關的信息中提取信息的情況。考慮以下數據:[ 1 2014-02-01 kjkj 在數據集中的每個唯一ID中檢索最後一行的信息,您可以在操作員上使用Postgres的有效效率: ...
    程式設計 發佈於2025-07-16
  • `console.log`顯示修改後對象值異常的原因
    `console.log`顯示修改後對象值異常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    程式設計 發佈於2025-07-16
  • Go語言垃圾回收如何處理切片內存?
    Go語言垃圾回收如何處理切片內存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片時,了解垃圾收集行為至關重要,以避免潛在的內存洩...
    程式設計 發佈於2025-07-16
  • 將圖片浮動到底部右側並環繞文字的技巧
    將圖片浮動到底部右側並環繞文字的技巧
    在Web設計中圍繞在Web設計中,有時可以將圖像浮動到頁面右下角,從而使文本圍繞它纏繞。這可以在有效地展示圖像的同時創建一個吸引人的視覺效果。 css位置在右下角,使用css float and clear properties: img { 浮點:對; ...
    程式設計 發佈於2025-07-16
  • C++20 Consteval函數中模板參數能否依賴於函數參數?
    C++20 Consteval函數中模板參數能否依賴於函數參數?
    [ consteval函數和模板參數依賴於函數參數在C 17中,模板參數不能依賴一個函數參數,因為編譯器仍然需要對非contexexpr futcoriations contim at contexpr function進行評估。 compile time。 C 20引入恆定函數,必須在編譯時進...
    程式設計 發佈於2025-07-16
  • Python環境變量的訪問與管理方法
    Python環境變量的訪問與管理方法
    Accessing Environment Variables in PythonTo access environment variables in Python, utilize the os.environ object, which represents a mapping of envir...
    程式設計 發佈於2025-07-16
  • Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    在ASP.NET async void void async void void void void void的設計無需返回asynchroncon而無需返回任務對象。他們在執行過程中增加未償還操作的計數,並在完成後減少。在某些情況下,這種行為可能是有益的,例如未期望或明確預期操作結果的火災和...
    程式設計 發佈於2025-07-16
  • 同實例無需轉儲複製MySQL數據庫方法
    同實例無需轉儲複製MySQL數據庫方法
    在同一實例上複製一個MySQL數據庫而無需轉儲在同一mySQL實例上複製數據庫,而無需創建InterMediate sqql script。以下方法為傳統的轉儲和IMPORT過程提供了更簡單的替代方法。 直接管道數據 MySQL手動概述了一種允許將mysqldump直接輸出到MySQL cli...
    程式設計 發佈於2025-07-16
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-07-16
  • 可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    程式設計 發佈於2025-07-16
  • PHP與C++函數重載處理的區別
    PHP與C++函數重載處理的區別
    作為經驗豐富的C開發人員脫離謎題,您可能會遇到功能超載的概念。這個概念雖然在C中普遍,但在PHP中構成了獨特的挑戰。讓我們深入研究PHP功能過載的複雜性,並探索其提供的可能性。 在PHP中理解php的方法在PHP中,函數超載的概念(如C等語言)不存在。函數簽名僅由其名稱定義,而與他們的參數列表無關...
    程式設計 發佈於2025-07-16
  • 為什麼HTML無法打印頁碼及解決方案
    為什麼HTML無法打印頁碼及解決方案
    無法在html頁面上打印頁碼? @page規則在@Media內部和外部都無濟於事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: ...
    程式設計 發佈於2025-07-16
  • Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    程式設計 發佈於2025-07-16
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-07-16
  • PHP未來:適應與創新
    PHP未來:適應與創新
    PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。 引言在編程世界中,PHP一直是網頁開發的中流砥柱。作為一個從1994年就開始發展...
    程式設計 發佈於2025-07-16

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3