」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 避免 React 中不必要的重新渲染

避免 React 中不必要的重新渲染

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

Avoiding Unnecessary Re-renders in React

建立高效能 React 應用程式的關鍵之一是避免不必要的重新渲染。 React 的渲染引擎非常高效,但防止在不需要的地方重新渲染仍然至關重要。在這篇文章中,我們將介紹常見錯誤以及如何避免這些錯誤。


1. 使用 React.memo 記憶組件

當元件的 props 沒有改變時,Memoization 可以幫助你跳過重新渲染。然而,如果不實作自訂比較函數,很容易誤用 React.memo。

錯誤用法:

const MemoizedComponent = React.memo(MyComponent);

這僅檢查 props 引用是否已更改,這可能並不總是足夠的。

正確用法:

const MemoizedComponent = React.memo(MyComponent, (prevProps, nextProps) => {
  return prevProps.itemId === nextProps.itemId;
});

這裡,我們使用自訂比較函數,只有在 itemId 屬性變更時才會觸發重新渲染。


2. 避免過度使用內聯函數

在 JSX 中使用內聯函數可能會導致不必要的重新渲染,因為 React 在每次渲染時都會將新函數視為新的 prop。

錯誤用法:

function ButtonComponent() {
  return ;
}

這會導致在每次渲染時重新建立handleClick,從而導致不必要的重新渲染。

正確用法:

import { useCallback } from 'react';

function ButtonComponent() {
  const handleClick = useCallback(() => {
    // Handle click logic
  }, []);

  return ;
}

透過使用 useCallback,我們記住了 handleClick 函數,從而防止在每次渲染時進行不必要的重新創建。


3. 利用 PureComponent

使用類別元件時,使用 React.PureComponent 可確保元件僅在其 props 或狀態變更時重新渲染。如果您使用 React.Component,可能會導致不必要的重新渲染。

錯誤用法:

class CardComponent extends React.Component {
  // Component logic
}

正確用法:

class CardComponent extends React.PureComponent {
  // Component logic
}

透過擴展 React.PureComponent,React 將淺層比較 props 和 state,避免不必要的重新渲染。


4. 優化功能組件中的useSelector

當使用react-redux中的useSelector時,僅選擇狀態的必要部分非常重要。

錯誤用法:

import { useSelector } from 'react-redux';

const DataComponent = () => {
  const globalState = useSelector((state) => state);
  // Render logic
};

每當狀態的任何部分發生變化時,這將導致元件重新渲染。

正確用法:

import { useSelector } from 'react-redux';

const DataComponent = () => {
  const selectedData = useSelector((state) => state.specificSlice);
  // Render logic based on specific slice
};

透過僅選擇狀態的必要部分,可以最大限度地減少重新渲染。


5. 在類別元件中實作shouldComponentUpdate

對於不擴展 PureComponent 的類別元件,手動實作 shouldComponentUpdate 可以更精細地控制元件何時重新渲染。

錯誤用法:

class ListItem extends React.Component {
  // Component logic
}

每次父元件渲染時都會重新渲染,即使 props 和 state 沒有改變。

正確用法:

class ListItem extends React.Component {
  shouldComponentUpdate(nextProps, nextState) {
    return this.props.itemId !== nextProps.itemId || this.state.value !== nextState.value;
  }

  // Component logic
}

透過自訂shouldComponentUpdate,我們確保元件僅在itemId屬性或值狀態變更時重新渲染。


結論

透過採用這些技術,您可以大幅減少 React 應用程式中不必要的重新渲染,從而獲得更好的效能。使用 React.memo 實現記憶化、利用 PureComponent 以及微調 shouldComponentUpdate 是優化 React 元件的關鍵策略。

了解何時以及如何優化渲染可以透過提供更快、響應更靈敏的應用程式來大大增強用戶體驗。


參考:

  1. 極客們的極客們。 (2023)。 React 中的記憶化是什麼?
  2. 同步融合。 (2024)。 React 中的記憶化
  3. Hygraph。 (2024)。什麼是 React Memo 以及如何使用它?
  4. Refine.dev。 (2024)。帶有範例的 React 備忘錄指南

如果您發現本指南有用,請考慮與其他人分享! ?


本部落格提供了更新且全面的概述,介紹如何避免 React 應用程式中不必要的重新渲染,同時結合最佳實踐並更改變數名稱,以確保現代 Web 開發實踐中的清晰度和相關性。

引用:
[1] https://www.geeksforgeeks.org/what-is-memoization-in-react/
[2] https://stackoverflow.com/questions/74013864/why-arent-all-react-components-wrapped-with-react-memo-by-default
[3] https://www.syncfusion.com/blogs/post/what-is-memoization-in-react
[4] https://hygraph.com/blog/react-memo
[5] https://refine.dev/blog/react-memo-guide/
[6] https://dmitripavlutin.com/use-react-memo-wisely/
[7] https://www.topcoder.com/thrive/articles/memoization-in-react-js
[8] https://react.dev/reference/react/memo

版本聲明 本文轉載於:https://dev.to/vyan/avoiding-unnecessary-re-renders-in-react-172k?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式接口中實現垂直滾動元素的CSS高度限制問題:考慮一個佈局,其中我們具有與用戶垂直滾動一起移動的可滾動地圖div,同時與固定的固定sidebar保持一致。但是,地圖的滾動無限期擴展,超過了視口的高度,阻止用戶訪問頁面頁腳。 映射{} 因此。我們不使用jQuery的“ .aimimate...
    程式設計 發佈於2025-05-09
  • 為什麼HTML無法打印頁碼及解決方案
    為什麼HTML無法打印頁碼及解決方案
    無法在html頁面上打印頁碼? @page規則在@Media內部和外部都無濟於事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: ...
    程式設計 發佈於2025-05-09
  • 如何從Google API中檢索最新的jQuery庫?
    如何從Google API中檢索最新的jQuery庫?
    從Google APIS 問題中提供的jQuery URL是版本1.2.6。對於檢索最新版本,以前有一種使用特定版本編號的替代方法,它是使用以下語法:獲取最新版本:未壓縮)While these legacy URLs still remain in use, it is recommended ...
    程式設計 發佈於2025-05-09
  • Python不會對超範圍子串切片報錯的原因
    Python不會對超範圍子串切片報錯的原因
    在python中用索引切片範圍:二重性和空序列索引單個元素不同,該元素會引起錯誤,切片在序列的邊界之外沒有。 這種行為源於索引和切片之間的基本差異。索引一個序列,例如“示例” [3],返回一個項目。但是,切片序列(例如“示例” [3:4])返回項目的子序列。 索引不存在的元素時,例如“示例” [9...
    程式設計 發佈於2025-05-09
  • 如何在鼠標單擊時編程選擇DIV中的所有文本?
    如何在鼠標單擊時編程選擇DIV中的所有文本?
    Programmatically Selecting DIV Text on Mouse ClickQuestionGiven a DIV element with text content, how can the user programmatically select the entire t...
    程式設計 發佈於2025-05-09
  • 為什麼我的CSS背景圖像出現?
    為什麼我的CSS背景圖像出現?
    故障排除:CSS背景圖像未出現 ,您的背景圖像儘管遵循教程說明,但您的背景圖像仍未加載。圖像和样式表位於相同的目錄中,但背景仍然是空白的白色帆布。 而不是不棄用的,您已經使用了CSS樣式: bockent {背景:封閉圖像文件名:背景圖:url(nickcage.jpg); 如果您的html,cs...
    程式設計 發佈於2025-05-09
  • 如何處理PHP文件系統功能中的UTF-8文件名?
    如何處理PHP文件系統功能中的UTF-8文件名?
    在PHP的Filesystem functions中處理UTF-8 FileNames 在使用PHP的MKDIR函數中含有UTF-8字符的文件很多flusf-8字符時,您可能會在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    程式設計 發佈於2025-05-09
  • 表單刷新後如何防止重複提交?
    表單刷新後如何防止重複提交?
    在Web開發中預防重複提交 在表格提交後刷新頁面時,遇到重複提交的問題是常見的。要解決這個問題,請考慮以下方法: 想像一下具有這樣的代碼段,看起來像這樣的代碼段:)){ //數據庫操作... 迴聲“操作完成”; 死(); } ? > ...
    程式設計 發佈於2025-05-09
  • 如何簡化PHP中的JSON解析以獲取多維陣列?
    如何簡化PHP中的JSON解析以獲取多維陣列?
    php 試圖在PHP中解析JSON數據的JSON可能具有挑戰性,尤其是在處理多維數組時。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    程式設計 發佈於2025-05-09
  • 編譯器報錯“usr/bin/ld: cannot find -l”解決方法
    編譯器報錯“usr/bin/ld: cannot find -l”解決方法
    錯誤:“ usr/bin/ld:找不到-l “ 此錯誤表明鏈接器在鏈接您的可執行文件時無法找到指定的庫。為了解決此問題,我們將深入研究如何指定庫路徑並將鏈接引導到正確位置的詳細信息。 添加庫搜索路徑的一個可能的原因是,此錯誤是您的makefile中缺少庫搜索路徑。要解決它,您可以在鏈接器命令中添...
    程式設計 發佈於2025-05-09
  • 如何使用Regex在PHP中有效地提取括號內的文本
    如何使用Regex在PHP中有效地提取括號內的文本
    php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
    程式設計 發佈於2025-05-09
  • Java中如何使用觀察者模式實現自定義事件?
    Java中如何使用觀察者模式實現自定義事件?
    在Java 中創建自定義事件的自定義事件在許多編程場景中都是無關緊要的,使組件能夠基於特定的觸發器相互通信。本文旨在解決以下內容:問題語句我們如何在Java中實現自定義事件以促進基於特定事件的對象之間的交互,定義了管理訂閱者的類界面。 以下代碼片段演示瞭如何使用觀察者模式創建自定義事件: args...
    程式設計 發佈於2025-05-09
  • 在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    mysql-python安裝錯誤:“ mysql_config找不到”“ 由於缺少MySQL開發庫而出現此錯誤。解決此問題,建議在Ubuntu上使用該分發的存儲庫。使用以下命令安裝Python-MysqldB: sudo apt-get安裝python-mysqldb sudo pip in...
    程式設計 發佈於2025-05-09
  • eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    稱量()和ast.literal_eval()中的Python Security 在使用用戶輸入時,必須優先確保安全性。強大的Python功能Eval()通常是作為潛在解決方案而出現的,但擔心其潛在風險。 This article delves into the differences betwee...
    程式設計 發佈於2025-05-09
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,將常數列添加到Spark DataFrame,該列具有適用於所有行的任意值的Spark DataFrame,可以通過多種方式實現。使用文字值(SPARK 1.3)在嘗試提供直接值時,用於此問題時,旨在為此目的的column方法可能會導致錯誤。 df.withco...
    程式設計 發佈於2025-05-09

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

Copyright© 2022 湘ICP备2022001581号-3