」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 每個開發人員都應該了解可擴展和高效應用程式的頂級 React 設計模式

每個開發人員都應該了解可擴展和高效應用程式的頂級 React 設計模式

發佈於2024-11-06
瀏覽:430

Top React Design Patterns Every Developer Should Know for Scalable and Efficient Apps

隨著 React 繼續主導前端生態系統,掌握其設計模式可以顯著提高應用程式的效率和可擴展性。 React 設計模式提供了組織和建置元件、管理狀態、處理 props 和提高可重複使用性的最佳實踐。在本部落格中,我們將探討一些關鍵的 React 設計模式,這些模式可以讓您的開發流程從優秀走向卓越。

1. 展示組件和容器組件

React 中的基本模式之一是 演示組件和容器組件 模式,這都是關於分離關注點的:

  • 演示組件: 這些組件負責事物的外觀。他們透過 props 接收資料和回調,但沒有自己的邏輯。它們的唯一目的是渲染 UI。

  • 容器元件: 這些元件管理事物的工作方式。它們包含邏輯、管理狀態並處理資料擷取或事件處理。容器組件將資料傳遞給展示組件。


// Presentational Component
const UserProfile = ({ user }) => (
  

{user.name}

{user.email}

); // Container Component const UserProfileContainer = () => { const [user, setUser] = useState({ name: 'John Doe', email: '[email protected]' }); return ; };

這種模式鼓勵關注點分離,使程式碼更易於維護和測試。

2. 高階組件(HOC)

高階元件 (HOC) 是重複使用元件邏輯的強大設計模式。 HOC 是一個函數,它接受一個元件並傳回一個具有增強行為或添加功能的新元件。

此模式通常用於橫切關注點,例如身份驗證、主題或資料獲取。


// Higher-Order Component for authentication
const withAuth = (WrappedComponent) => {
  return (props) => {
    const isAuthenticated = // logic to check auth;

    if (!isAuthenticated) {
      return 
You need to log in!
; } return ; }; }; // Usage const Dashboard = () =>
Welcome to the dashboard
; export default withAuth(Dashboard);

HOC 透過跨多個元件實現可重複使用邏輯來促進 DRY(不要重複自己)原則。

3. 渲染道具

Render Props 模式涉及將函數作為 prop 傳遞給元件,從而允許基於該函數動態渲染內容。這對於在不使用 HOC 的情況下在元件之間共享狀態邏輯特別有用。


// Render Prop Component
class MouseTracker extends React.Component {
  state = { x: 0, y: 0 };

  handleMouseMove = (event) => {
    this.setState({ x: event.clientX, y: event.clientY });
  };

  render() {
    return (
      
{this.props.render(this.state)}
); } } // Usage const App = () => (

Mouse position: {x}, {y}

} /> );

此模式透過將邏輯與 UI 分離來為您提供靈活性,使元件更加可重複使用且可自訂。

4. 複合組件

複合元件模式通常用於react-select 或react-table 等函式庫。它允許父元件控制一組子元件。這種模式提高了建構可重複使用和動態介面的靈活性。


// Compound Component
const Tabs = ({ children }) => {
  const [activeTab, setActiveTab] = useState(0);

  return (
    
{children.map((child, index) => ( ))}
{children[activeTab]}
); }; // Usage
Content of Tab 1
Content of Tab 2
;

此模式為父子通訊提供了一個乾淨的 API,同時保持元件的靈活性和可自訂性。

5. 受控組件與非受控組件

React 提供了兩種管理表單輸入的方式:受控元件非受控元件

  • 受控元件:這些元件的狀態完全由 React 透過 props 控制,這使得它們更可預測。

  • 不受控制的元件:這些元件依賴 ref 來直接操作 DOM,提供較少的控制,但可能提高效能。


// Controlled Component
const ControlledInput = () => {
  const [value, setValue] = useState('');

  return  setValue(e.target.value)} />;
};

// Uncontrolled Component
const UncontrolledInput = () => {
  const inputRef = useRef();

  const handleClick = () => {
    console.log(inputRef.current.value);
  };

  return ;
};


在這些模式之間進行選擇取決於您是否需要細粒度控製或輕量級效能最佳化。

6. 自訂掛鉤

React Hooks 讓我們以可重複使用的方式建立自訂邏輯。透過將通用邏輯提取到自訂鉤子中,我們可以避免程式碼重複並使我們的程式碼庫更加模組化。


// Custom Hook
const useFetch = (url) => {
  const [data, setData] = useState(null);
  const [error, setError] = useState(null);

  useEffect(() => {
    fetch(url)
      .then((response) => response.json())
      .then((data) => setData(data))
      .catch((error) => setError(error));
  }, [url]);

  return { data, error };
};

// Usage
const DataFetchingComponent = () => {
  const { data, error } = useFetch('https://api.example.com/data');

  if (error) return 

Error: {error.message}

; if (!data) return

Loading...

; return
{data.someField}
; };

自訂掛鉤可以更好地分離關注點並以聲明性方式重複使用公共功能。

結論

設計模式是編寫乾淨、可維護和可擴展的 React 應用程式的關鍵部分。透過利用展示元件和容器元件、HOC、渲染道具、複合元件和自訂掛鉤等模式,您可以確保您的程式碼靈活、可重複使用且易於理解。

理解和實現這些模式可以大大改善您的開發工作流程,使您的 React 專案更加有組織和高效。嘗試將它們合併到您的下一個專案中,體驗程式碼品質和可維護性方面的差異!

版本聲明 本文轉載於:https://dev.to/ishanbagchi/top-react-design-patterns-every-developer-should-know-for-scalable-and-efficient-apps-245e?1如有侵犯,請聯絡study_golang @163.com刪除
最新教學 更多>
  • 如何使用 TForm::Handle 在 C++ Builder 窗體中渲染 OpenGL 幀?
    如何使用 TForm::Handle 在 C++ Builder 窗體中渲染 OpenGL 幀?
    在C Builder 中渲染OpenGL 幀問題我想在C Builder 中的窗體內渲染OpenGL 幀,但我遵循提供的OpenGL 啟動程式碼時遇到問題。我該如何解決這個問題? 答案利用 TForm::Handle 作為視窗句柄利用 TForm::Handle 作為視窗句柄視窗句柄。 範例實作以下...
    程式設計 發佈於2024-11-07
  • 如何在沒有 Swagger UI 的情況下向 FastAPI 提交 JSON 資料?
    如何在沒有 Swagger UI 的情況下向 FastAPI 提交 JSON 資料?
    在 FastAPI 中繞過 Swagger UI 進行 JSON 資料輸入使用 FastAPI 時,可以在沒有 Swagger UI 中介的情況下發布 JSON 資料。實現此目的的方法如下:用於 JSON 資料提交的 JavaScript 介面採用基於 JavaScript 的介面(例如 Fetch...
    程式設計 發佈於2024-11-07
  • 在 Hacktoberfest 中做出貢獻的新方式:直接在前端 AI
    在 Hacktoberfest 中做出貢獻的新方式:直接在前端 AI
    Hacktoberfest 又回來了,今年為開發者帶來了一種令人興奮的新參與方式。 您現在可以直接透過 Webcrumbs 平台上的 Frontend AI 建立和提交模板,而不是傳統的 GitHub Pull 請求。只需前往tools.webcrumbs.org,對模板進行編碼,然後在準備好後點擊...
    程式設計 發佈於2024-11-07
  • 為什麼使用不帶括號的函數指標時“cout”列印“1”?
    為什麼使用不帶括號的函數指標時“cout”列印“1”?
    為什麼「cout a function without call it (not f() but f;). Print 1 Always?」在此程式碼中,程式碼嘗試在不使用括號的情況下「呼叫」名為pr 的函數。然而,這實際上並不是呼叫該函數。相反,它將函數指標傳遞給 cout 函數。當函數指標隱式轉...
    程式設計 發佈於2024-11-07
  • 讓您的網頁更快
    讓您的網頁更快
    什么是 DOM?它吃什么? DOM(文档对象模型)是网页及其开发的基础。它是 HTML 和 XML 文档的编程接口,以树状对象表示文档的结构。有树枝和树叶。文档中的每个元素、属性和文本片段都成为该树中的一个节点。它允许 JavaScript 与 HTML 元素交互、修改它们或添加新...
    程式設計 發佈於2024-11-07
  • JavaScript 中的 require 與 import
    JavaScript 中的 require 與 import
    我記得當我開始編碼時,我會看到一些js檔案使用require()來匯入模組和其他檔案使用import。這總是讓我感到困惑,因為我並不真正理解其中的差異是什麼,或者為什麼專案之間存在不一致。如果您想知道同樣的事情,請繼續閱讀! 什麼是 CommonJS? CommonJS 是一組用於...
    程式設計 發佈於2024-11-07
  • 使用鏡像部署 Vite/React 應用程式:完整指南
    使用鏡像部署 Vite/React 應用程式:完整指南
    在 GitHub Pages 上部署 Vite/React 应用程序是一个令人兴奋的里程碑,但这个过程有时会带来意想不到的挑战,特别是在处理图像和资产时。这篇博文将引导您完成整个过程,从最初的部署到解决常见问题并找到有效的解决方案。 无论您是初学者还是有经验的人,本指南都将帮助您避免常见的陷阱,并...
    程式設計 發佈於2024-11-07
  • 我如何在我的 React 應用程式中優化 API 呼叫
    我如何在我的 React 應用程式中優化 API 呼叫
    作为 React 开发者,我们经常面临需要通过 API 同步多个快速状态变化的场景。对每一个微小的变化进行 API 调用可能效率低下,并且会给客户端和服务器带来负担。这就是去抖和巧妙的状态管理发挥作用的地方。在本文中,我们将构建一个自定义 React 钩子,通过合并有效负载和去抖 API 调用来捕获...
    程式設計 發佈於2024-11-07
  • 我們走吧!
    我們走吧!
    為什麼你需要嘗試 GO Go 是一種快速、輕量級、靜態類型的編譯語言,非常適合建立高效、可靠的應用程式。它的簡單性和簡潔的語法使其易於學習和使用,特別是對於新手來說。 Go 的突出功能包括內建的 goroutine 並發性、強大的標準庫以及用於程式碼格式化、測試和依賴管理的強大工具...
    程式設計 發佈於2024-11-06
  • 如何將 PNG 圖像編碼為 CSS 資料 URI 的 Base64?
    如何將 PNG 圖像編碼為 CSS 資料 URI 的 Base64?
    在CSS 資料URI 中對PNG 圖像使用Base64 編碼為了使用資料URI 將PNG 圖片嵌入到CSS 樣式表中,PNG資料必須先編碼為Base64 格式。此技術允許將外部圖像檔案直接包含在樣式表中。 Unix 命令列解決方案:base64 -i /path/to/image.png此指令將輸出...
    程式設計 發佈於2024-11-06
  • API 每小時資料的響應式 JavaScript 輪播
    API 每小時資料的響應式 JavaScript 輪播
    I almost mistook an incomplete solution for a finished one and moved on to work on other parts of my weather app! While working on the carousel that w...
    程式設計 發佈於2024-11-06
  • 用於 Web 開發的 PHP 和 JavaScript 之間的主要差異是什麼?
    用於 Web 開發的 PHP 和 JavaScript 之間的主要差異是什麼?
    PHP 與 JavaScript:伺服器端與客戶端 PHP 的作用與 JavaScript 不同。 PHP 運行在伺服器端。伺服器運行應用程式。除此之外,它還處理表單。當您提交表單時,PHP 會對其進行處理。另一方面,JavaScript 是客戶端的。它在瀏覽器中運行。它處理頁面互...
    程式設計 發佈於2024-11-06
  • 如何在 C++ 中迭代結構和類別成員以在運行時存取它們的名稱和值?
    如何在 C++ 中迭代結構和類別成員以在運行時存取它們的名稱和值?
    迭代結構體和類別成員在 C 中,可以迭代結構體或類別的成員來檢索它們的名稱和價值觀。以下是實現此目的的幾種方法:使用巨集REFLECTABLE 巨集可用於定義允許自省的結構。該巨集將結構體的成員定義為以逗號分隔的類型名稱對清單。例如:struct A { REFLECTABLE ( ...
    程式設計 發佈於2024-11-06
  • 如果需要準確答案,請避免浮動和雙精度
    如果需要準確答案,請避免浮動和雙精度
    float 和 double 問題: 專為科學和數學計算而設計,執行二元浮點運算。 不適合貨幣計算或需要精確答案的情況。 無法準確表示10的負次方,例如0.1,從而導致錯誤。 範例1: 減去美元金額時計算錯誤: System.out.println(1.03 - 0.42); // Resu...
    程式設計 發佈於2024-11-06
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-06

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

Copyright© 2022 湘ICP备2022001581号-3