」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 馴服野獸:我該如何重構凌亂的 React 元件

馴服野獸:我該如何重構凌亂的 React 元件

發佈於2024-11-08
瀏覽:997

Taming the Beast: How I Refactored a Messy React Component

我們都去過那裡。你打開幾個月前編寫的 React 元件,感覺就像你正在看一個由匆忙的人編寫的程式碼 - 因為你可能很匆忙。截止日期迫在眉睫,功能需要交付。快轉到今天,是時候重建那個混亂的元件了。

所以,這就是我解決這個問題的方法。

最初的恐怖

我注意到的第一件事是該組件變得太大了。它嘗試做所有事情,例如處理狀態、進行 API 呼叫、管理複雜的 UI 邏輯,甚至直接套用樣式。這是一個超過 540 行的文件,通讀它就像在沒有地圖的叢林中漫步一樣。

第一步是接受現實:這段程式碼不再可維護。如果我(寫這篇文章的人)幾乎無法理解正在發生的事情,那麼其他人就沒有機會。所以,我決定把它分解。

分解它

我先確定組件的不同職責。共有三個明確的區域:

  1. 狀態管理:處理元件的狀態與 UI 邏輯交織在一起。

  2. API呼叫:取得資料並處理載入狀態。

  3. 渲染 UI:以稍微複雜的 UI 結構顯示資料。
    這些職責中的每一個都需要分開。

提取狀態和 API 邏輯的鉤子

我做的第一件事是將狀態管理和 API 邏輯提取到自訂掛鉤中。這不僅清理了元件,而且還使在其他地方測試和重複使用邏輯變得更容易。

這裡提到一些程式碼(不是原來的程式碼):

function useDataFetching(apiEndpoint) {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    async function fetchData() {
      try {
        let response = await fetch(apiEndpoint);
        let result = await response.json();
        setData(result);
      } catch (err) {
        setError(err);
      } finally {
        setLoading(false);
      }
    }

    fetchData();
  }, [apiEndpoint]);

  return { data, loading, error };
}

透過useDataFetching,我提取了API呼叫邏輯並處理了載入和錯誤狀態。現在,元件只需要呼叫這個鉤子並取得必要的數據,乾淨又簡單。

簡化 UI 邏輯
接下來,我查看了渲染邏輯。以前,我在渲染函數中檢查載入、錯誤和數據,這使得它很難理解。我將這個邏輯分成小的、獨立的函數,就像這樣(當然不是原來的函數;)

function renderLoading() {
  return 

Loading...

; } function renderError(error) { return

Error: {error.message}

; } function renderData(data) { return
{/* Complex UI logic here */}
; } //After that, component is ni much pretty shape function MyComponent() { const { data, loading, error } = useDataFetching('/api/data-endpoint'); if (loading) return renderLoading(); if (error) return renderError(error); if (data) return renderData(data); return null; }

最後的談話

分解元件後,檔案從 540 多行減少到大約 124 行,邏輯也更容易理解。該元件現在只做一件事:渲染 UI。其他所有內容都已卸載到自訂掛鉤和實用函數。

這次經歷讓我學到了一些重要的教訓:

  • 不要害怕重構:很容易保留混亂的程式碼,尤其是當它有效時。但花時間清理它會讓你的生活——以及你未來的自己的生活——變得更加輕鬆。

  • 關注點分離:在不同的地方(狀態、API、UI)保留不同的關注點使程式碼更加模組化、可重複使用和可測試。

  • 保持簡單:透過將邏輯卸載到更小的函數來簡化渲染函數,使元件更具可讀性。

所以,如果你有一個像你一樣混亂的元件,請毫不猶豫地重構。這不僅僅是關於乾淨的程式碼,而是讓您作為開發人員的生活更輕鬆。誰不想要這樣?

版本聲明 本文轉載於:https://dev.to/hasnatamjad/taming-the-beast-how-i-refactored-a-messy-react-component-50ke?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Node.js 傻瓜指南 - MongoDB 和 Fastify
    Node.js 傻瓜指南 - MongoDB 和 Fastify
    O que é Node.js? Node.js, uma plataforma construída sobre o motor de JavaScript V8 do Google Chrome, revolucionou o desenvolvimento backend n...
    程式設計 發佈於2024-11-08
  • 如何使用 Joda Time 將日期字串解析為 DateTime 物件並避免「無效格式」錯誤?
    如何使用 Joda Time 將日期字串解析為 DateTime 物件並避免「無效格式」錯誤?
    使用Joda Time 將日期字串解析為DateTime 物件處理日期和時間資料時,通常需要轉換日期作為字串儲存到結構化物件中以便進一步處理。 Joda Time 庫提供了一套全面的工具,用於處理 Java 中的日期和時間操作。 一個常見任務是將日期字串轉換為 DateTime 物件。但是,如果字串...
    程式設計 發佈於2024-11-08
  • 如何解決 PHP 中的「每個引號前都有斜線」問題?
    如何解決 PHP 中的「每個引號前都有斜線」問題?
    理解「引號前的斜槓」問題在某些情況下,PHP網頁可能會遇到提交表單資料導致添加一個每個雙引號前都有反斜線。此問題是由稱為“魔術引號”的伺服器配置功能引起的。 啟用魔術引號後,PHP 在向資料庫或表單提交發送或從資料庫或表單提交接收某些字符時,會自動轉義某些字符,包括雙引號。雖然這可以透過轉義惡意引號...
    程式設計 發佈於2024-11-08
  • ## 如何在 C++ 中將多維數組轉換為函式庫函數的指標?
    ## 如何在 C++ 中將多維數組轉換為函式庫函數的指標?
    在 C 中將多維數組轉換為指標 在 C 中,多維數組與指標不直接相容。當嘗試使用採用 double** 的函式庫函數時,使用簡單的強制轉換轉換 double4 陣列可能會導致錯誤。 要解決此問題,必須使陣列適應函數的介面。不要將整個陣列轉換為double**,而是建立指向每行開頭的臨時「索引」陣列:...
    程式設計 發佈於2024-11-08
  • 如何在 PHP 中非同步執行 cURL 請求?
    如何在 PHP 中非同步執行 cURL 請求?
    PHP中的非同步Curl請求在PHP中非同步執行curl post請求可以提高效能並防止潛在的延遲。以下是如何使用不同的方法實現此目的:使用非同步 cURL 函數使用curl_multi_*時,您可以同時執行多個 cURL 要求。以下是一個範例程式碼:$curl = curl_init($reque...
    程式設計 發佈於2024-11-08
  • 如何將 Boehm 垃圾收集器與 C++ 標準庫類別(如“std::vector”和“std::string”)整合?
    如何將 Boehm 垃圾收集器與 C++ 標準庫類別(如“std::vector”和“std::string”)整合?
    將Boehm 垃圾收集器與C 標準庫結合使用開發多線程C 應用程式時,Boehm 保守的垃圾收集器對於簡化記憶體非常有用管理。這就提出瞭如何將 Boehm GC 與 C 標準函式庫的類別(如 std::map 和 std::vector)整合的問題。 一種方法涉及重新定義全域運算子 ::new 以使...
    程式設計 發佈於2024-11-08
  • 如何管理具有共用欄位的類似 Go 結構的函數?
    如何管理具有共用欄位的類似 Go 結構的函數?
    Go 最佳實踐:管理具有共享字段的相似結構體的函數在Go 中,經常會遇到具有相似字段的多個結構體,並且需要對它們執行相同的操作。為了在保持靈活性的同時避免程式碼重複,請考慮以下策略:為共享欄位建立自訂類型:如果共用欄位是簡單資料類型(例如,字串),考慮為其定義自訂類型。這允許您將方法附加到自訂類型,...
    程式設計 發佈於2024-11-08
  • 如何在Ajax資料載入過程中顯示進度條?
    如何在Ajax資料載入過程中顯示進度條?
    如何在Ajax 資料載入期間顯示進度條處理使用者觸發的事件(例如從下拉方塊中選擇值)時,通常會使用非同步擷取資料阿賈克斯。在獲取數據時,向用戶提供正在發生某事的視覺指示是有益的。本文探討了一種在 Ajax 請求期間顯示進度條的方法。 使用 Ajax 實作進度條要建立一個準確追蹤 Ajax 呼叫進度的...
    程式設計 發佈於2024-11-08
  • 如何在 PHP 中透過 SSH 安全連接到遠端 MySQL 伺服器?
    如何在 PHP 中透過 SSH 安全連接到遠端 MySQL 伺服器?
    在PHP 中透過SSH 安全連接到遠端MySQL 伺服器要為PHP 資料庫連線建立安全隧道,以下SSH 隧道解決方案提供了一種強大的方法。 SSH 隧道設定建立通往 MySQL 資料庫伺服器的 SSH 隧道。為此,請使用以下命令:ssh -fNg -L 3307:10.3.1.55:3306 [em...
    程式設計 發佈於2024-11-08
  • 混淆技術真的可以保護可執行檔免受逆向工程的影響嗎?
    混淆技術真的可以保護可執行檔免受逆向工程的影響嗎?
    保護可執行檔免於逆向工程:解決方案有限的挑戰保護程式碼免於未經授權的逆向工程是開發人員持續關注的問題,尤其是當它包含敏感資訊時。雖然已經提出了各種方法,但重要的是要承認完全防止逆向工程實際上是不可能的。 常見混淆技術使用者建議的策略,例如程式碼注入、混淆和自訂啟動例程的目的是使反彙編變得不那麼簡單。...
    程式設計 發佈於2024-11-08
  • 掌握 Laravel 中的 Eloquent where 條件
    掌握 Laravel 中的 Eloquent where 條件
    Laravel 的 Eloquent ORM(物件關係映射)是其突出的功能之一,提供了與資料庫互動的強大而富有表現力的方式。 Eloquent 提供的一項基本功能是方法,它允許開發人員高效、直觀地過濾查詢。在本文中,我們將深入研究 where 條件,探索其各種形式和實際用例。 w...
    程式設計 發佈於2024-11-08
  • 在 Gmail 的 Chrome 12+ 更新中如何從剪貼簿貼上圖片?
    在 Gmail 的 Chrome 12+ 更新中如何從剪貼簿貼上圖片?
    將剪貼簿中的圖像貼到Gmail:Chrome 12 中的操作方法Google 宣布能夠將剪貼簿中的圖像直接貼到Gmail使用Chrome 12 的Gmail 引發了人們對其底層機制的好奇。儘管使用了最新的 Chrome 版本,但一些用戶仍然無法找到有關如何在 Webkit 中實現此增強功能的資訊。 ...
    程式設計 發佈於2024-11-08
  • JavaScript 示範場景競賽 - JS 版
    JavaScript 示範場景競賽 - JS 版
    JS1024 於 2024 年回歸! 準備好迎接令人興奮的挑戰! JS1024 回歸,透過在 JavaScript、HTML 或 GLSL 中創建令人驚嘆的演示(全部在 1024 位元組限制內),將開發人員推向極限。無論您是經驗豐富的編碼員還是新手,這都是您展示創造力和技術技能的機...
    程式設計 發佈於2024-11-08
  • 第九屆 TCmeeting 的更新
    第九屆 TCmeeting 的更新
    議程上有幾個項目,本文重點介紹第 104 次 TC39 會議 [2024 年 10 月 8 日至 10 日] 的功能提案及其進展。 第一階段: 表示度量:建議在 JavaScript 中使用適當的單位格式化和表示度量。 Immutable ArrayBuffers:新增 Arra...
    程式設計 發佈於2024-11-08
  • 如何使用 CSS 在圖像地圖上實現滑鼠懸停效果?
    如何使用 CSS 在圖像地圖上實現滑鼠懸停效果?
    使用 CSS 設定圖片地圖滑鼠懸停樣式使用 CSS 設定圖片地圖滑鼠懸停樣式建立互動網頁時,通常需要包含具有可點擊區域的圖像。通常,這是使用圖像映射來實現的。然而,事實證明,在滑鼠懸停時設置這些區域的樣式以提供額外的互動性是難以實現的。 <img src="{main_photo}&...
    程式設計 發佈於2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3