【React】性能提升方案:Reat.memo, useMemo,useCallback用法詳解

前言:Reat.memo, useMemo,useCallback是React中用于性能優化的三個核心API,它們分別針對組件渲染,計算緩存和函數引用進行優化。

一、React.memo

作用:緩存組件,當父組件重新渲染時,若子組件的props未變化,則阻止子組件重新渲染。

注意:對渲染成本極低的組件(如簡單的文本展示),使用React.memo,反而增加了淺比較的開銷

? ? ? ? ? 使用Redux的connet或自定義HOC,若未顯式設置{ forwardRef: true},會導致ref或props傳遞中斷,連帶React.memo失效

const Child = React.memo(({ name }) => {console.log("子組件渲染");return <div>{name}</div>;});const Parent = () => {const [count, setCount] = useState(0);return (<div><button onClick={() => setCount(count + 1)}>點擊</button><Child name="固定值" /> ?{/* 不會因父組件count變化而重新渲染 */}</div>);};

    二、useMemo

    作用:緩存計算結果,當依賴項未發生變化時避免重復計算

    注意:數據規模極小,不適合使用useMemo

    ? ? ? ? ? 依賴項頻繁變化,不適合用useMemo

    ? ? ? ? ? 組件本身渲染頻率低,不適合用useMemo

    ? ? ? ? ? 過度嵌套useMemo,使代碼難以維護,且可能引起隱蔽的依賴錯誤

    權衡標準:數據規模>100項

    ??????????計算復雜度>=O(線性對數增長)

    ??????????組件渲染頻率>1次/秒

    緩存維護開銷:淺比較成本:useMemo需比較依賴數組的每個值

    ? ? ? ? ? ? ? ? ? ? ? ? ?內存占用:緩存結果會增加內存使用,尤其在頻繁觸發更新的組件中

    const ExpensiveComponent = ({ list }) => {const filteredList = useMemo(() => {return list.filter(item => item.value > 10); ?// 復雜計算}, [list]); ?// 僅當list變化時重新計算return <div>{filteredList.map(item => <span key={item.id}>{item.value}</span>)}</div>;};

      三、useCallback

      作用:緩存函數引用,避免子組件因函數引用變化而重新渲染

      注意:useCallback的依賴項過于頻繁變化,導致緩存頻繁失效,反而增加計算負擔

      ? ? ? ? ? ?過度嵌套useCallback,使代碼難以維護,且可能引起隱蔽的依賴錯誤

      const Child = React.memo(({ onClick }) => {console.log("子組件渲染");return <button onClick={onClick}>點擊</button>;
      });const Parent = () => {const [count, setCount] = useState(0);const handleClick = useCallback(() => {setCount(prev => prev + 1);}, []);  // 依賴為空,函數引用不變return (<div><Child onClick={handleClick} /><p>Count: {count}</p></div>);
      };
      
      • 四、性能瓶頸的判定標準

      • 可觀測的渲染延遲:
      • 組件樹深層嵌套導致渲染時間超過16ms(單幀時間),引發界面卡頓

        高頻交互(如動畫、滾動)因重復計算或渲染出現掉幀

      • 不必要的子組件渲染
      • 父組件狀態變更連帶觸發大量子組件渲染,但子組件props實際未變化

        大型列表未做虛擬滾動或key優化,導致DOM操作阻塞主線程

      • 計算資源浪費
      • 復雜計算(如數組排序,數據轉換)在每次渲染時,占用CPU資源

        本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
        如若轉載,請注明出處:http://www.pswp.cn/diannao/98090.shtml
        繁體地址,請注明出處:http://hk.pswp.cn/diannao/98090.shtml
        英文地址,請注明出處:http://en.pswp.cn/diannao/98090.shtml

        如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

        相關文章

        Alibaba Cloud Linux 3 安裝Docker

        Alibaba Cloud Linux 3 基于 Red Hat Enterprise Linux (RHEL) 兼容內核&#xff0c;安裝 Docker 的步驟與 RHEL/CentOS 系列類似&#xff0c;以下是具體操作&#xff1a; 1. 卸載舊版本&#xff08;如有&#xff09; sudo dnf remove docker docker-client docker-client-la…

        每日一練001.pm

        題目詳情&#xff1a; P5705 【深基2.例7】數字反轉 - 洛谷 題目描述 輸入一個不小于 100 且小于 1000&#xff0c;同時包括小數點后一位的一個浮點數&#xff0c; 例如 123.4 &#xff0c;要求把這個數字翻轉過來&#xff0c;變成 4.321 并輸出。 #include<iostream&g…

        AI智能優化SEO關鍵詞策略實戰

        本文聚焦AI如何智能優化SEO關鍵詞策略&#xff0c;通過實戰案例分享高效技巧&#xff0c;幫助提升網站搜索排名和流量轉化效果。內容涵蓋AI革新關鍵詞策略的原理、智能優化技巧的實際應用、高效關鍵詞布局方法、避免常見錯誤的實戰指南&#xff0c;以及綜合策略推動排名飛躍的路…

        360° 拖動旋轉的角度計算原理

        360 拖動旋轉的角度計算原理 簡化的 正方形 div demo 專注講清楚「點擊 / 拖動如何計算角度」這個原理&#xff0c;沒有精美 UI哦 中間標注中心點鼠標點擊或拖動時&#xff0c;計算當前位置相對于中心的角度在頁面上實時顯示角度代碼示例&#xff08;原生 HTML JS&#xff09;…

        五分鐘XML速成

        原文鏈接&#xff1a; XML - Dive Into Python 3 深入探討 本書幾乎所有章節都圍繞一段示例代碼展開&#xff0c;但 XML 并非關于代碼&#xff0c;而是關于數據。 XML 的一個常見用途是 “聚合提要”&#xff08;syndication feeds&#xff09;&#xff0c;用于列出博客、論壇…

        如何直接訪問docker容器中的端口服務而不需要改端口映射

        查看docker容器對于宿主服務器的ip地址 docker inspect -f {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}} $容器名 # 替換$容器名 為自己的啟動docker內的服務&#xff0c;監聽端口是否用信息 curl http://172.17.0.2:90有信息就可以直接通過該ip訪問docker容器端口…

        《Istio故障溯源:從流量劫持異常到服務網格的底層博弈》

        服務網格常被企業視為微服務通信復雜性的“終極方案”。不少團隊在部署Istio時,往往滿足于“控制面啟動、Sidecar注入成功”的表層驗證,卻忽視了底層機制與業務場景的深度適配—這種“重部署輕調優”的心態,往往為后續的生產故障埋下隱患。某大型金融機構的核心交易中臺在接…

        第24節:3D音頻與空間音效實現

        第24節&#xff1a;3D音頻與空間音效實現 概述 3D音頻是構建沉浸式體驗的關鍵組件&#xff0c;它通過模擬真實世界中的聲音傳播特性&#xff0c;為用戶提供空間感知和方向感。本節將深入探討Web Audio API與Three.js的集成&#xff0c;涵蓋空間音效原理、音頻可視化、多聲道處理…

        一步搞清楚本地客戶端和全局服務器是如何更新模型的

        我們可以把它想象成一個 “老師”和“學生” 協作學習的過程。全局服務器 “老師”本地客戶端 “學生”整個模型更新的過程遵循一個核心原則&#xff1a;“數據不動&#xff0c;模型動”。原始數據永遠留在本地客戶端&#xff0c;只有模型的參數&#xff08;即模型的“知識”…

        跨平臺超低延遲RTSP播放器技術設計探究

        摘要 RTSP 播放在實驗室里“跑起來”并不難&#xff0c;難的是在真實場景中做到 超低延遲、跨平臺、高穩定&#xff0c;并長期可靠運行。大牛直播SDK&#xff08;SmartMediaKit&#xff09;的全自研跨平臺 RTSP 播放棧&#xff0c;正是把這些工程難題轉化為可用、可控、可交付的…

        知識點匯集——web(三)

        1.index.php 的備份文件名通常為index.php.bak 2.PHP2是服務器端腳本語言&#xff0c;主要用于處理和生成網頁的內容&#xff0c;當用戶訪問一個網站時&#xff0c;PHP腳本會在服務器上執行&#xff0c;生成動態的HTML頁面&#xff0c;然后將頁面發送給用戶的瀏覽器進行顯示。p…

        變頻器【簡易PLC】功能中的時間問題

        一、變頻器的簡易PLC功能簡易PLC功能是將提前設置好的多端速頻率&#xff0c;進行自動運行&#xff0c;類似于PLC程序中的CASE指令一樣&#xff0c;我們需要提前設置好幾段頻率&#xff0c;該頻率所維持的時間&#xff0c;以及加減速時間&#xff0c;按下啟動后&#xff0c;變頻…

        Swift 解題:LeetCode 372 超級次方(Super Pow)

        文章目錄摘要描述題解答案題解代碼分析代碼解析示例測試及結果時間復雜度空間復雜度總結摘要 在算法題里&#xff0c;有一些問題看似“簡單”&#xff0c;比如算一個冪次方&#xff0c;但一旦放大規模就完全不同了。LeetCode 372 超級次方就是這樣的題目。普通的冪運算沒什么難…

        揭秘23種設計模式的藝術與技巧之結構型

        結構型模式&#xff1a;優化軟件結構的策略代理模式&#xff08;Proxy Pattern&#xff09;代理模式就像一個經紀人&#xff0c;代表真實對象進行操作。比如&#xff0c;在網絡訪問中&#xff0c;我們可能會通過代理服務器來訪問外部網站。在軟件中&#xff0c;當一個對象由于某…

        PyTorch圖像數據轉換為張量(Tensor)并進行歸一化的標準操作

        transform ToTensor() 是 PyTorch 中用于將圖像數據轉換為張量&#xff08;Tensor&#xff09;并進行歸一化的標準操作&#xff0c;以下是對其功能的逐層解析及關鍵細節&#xff1a;核心功能總結功能描述類型轉換將 PIL Image / numpy 數組 → PyTorch Tensor (dtype: torch.f…

        HarmonyOS學習

        一&#xff0c;DevEoc Studio基本內容學習項目工程目錄entry 默認的項目入口模塊ets 界面相關文件&#xff08;目前都放入pages文件內即可&#xff09;resource資源文件&#xff0c;配置文件index.est默認文件’ ‘開頭的一般為裝飾器&#xff0c;修飾功能&#xff0c;來約定后…

        【大前端】Vue 和 React 主要區別

        Vue 與 React 的主要區別 在前端開發領域&#xff0c;Vue 和 React 是兩大最受歡迎的框架/庫。盡管它們都可以幫助我們構建現代化的 Web 應用&#xff0c;但在設計理念、開發方式、生態系統等方面有許多不同。本文將從多個角度對兩者進行對比。 目錄 框架與庫的定位核心理念…

        高級RAG策略學習(五)——llama_index實現上下文窗口增強檢索RAG

        LlamaIndex上下文窗口實現詳解 概述 本文檔詳細講解基于LlamaIndex框架實現的上下文窗口RAG系統&#xff0c;重點分析關鍵步驟、語法結構和參數配置。 1. 核心導入與環境配置 1.1 必要模塊導入 from llama_index.core import Settings from llama_index.llms.dashscope import …

        Doris 數據倉庫例子

        基于 Apache Doris 構建數據倉庫的方案和具體例子。Doris 以其高性能、易用性和實時能力&#xff0c;成為構建現代化數據倉庫&#xff08;特別是 OLAP 場景&#xff09;的優秀選擇。一、為什么選擇 Doris 構建數據倉庫&#xff1f;Doris&#xff08;原名 Palo&#xff09;是一個…

        WebRTC進階--WebRTC錯誤Failed to unprotect SRTP packet, err=9

        文章目錄 原因分析 SRTP Anti-Replay 機制 客戶端源碼 err=9 的定義: 為什么會觸發 replay_fail ? 解決方向 原因分析 SRTP Anti-Replay 機制 SRTP 收包時會用一個 Replay Window(64/128個序列號大小)檢查 seq 是否合理。 如果你構造的恢復包 recover_seq 比當前接收窗口…