react性能優化有哪些

React 性能優化的手段比較多,既有代碼層面的,也有構建層面的,還涉及到運行時調優。我幫你系統性梳理一份:


🔹 一、渲染性能優化

1. 減少不必要的渲染

  • React.memo:對函數組件做淺比較,避免相同 props 時重復渲染。

  • useMemo / useCallback:緩存計算結果或函數引用,減少子組件 re-render。

  • PureComponent(class 組件):類似 React.memo,內置淺比較。

const Child = React.memo(({ value }: { value: number }) => {console.log("render child");return <div>{value}</div>;
});function App() {const [count, setCount] = useState(0);return <Child value={count} />;
}

2. 合理使用 key

  • key 決定 React Diff 算法的復用策略,避免用 index 作為 key,優先使用唯一 id。


3. 虛擬化長列表

  • react-window / react-virtualized:只渲染可視區域,提高長列表性能。

import { FixedSizeList as List } from "react-window";<Listheight={400}itemCount={1000}itemSize={35}width={300}
>{({ index, style }) => <div style={style}>Row {index}</div>}
</List>

4. 避免在渲染時做重計算

  • 不要在 JSX 里直接做大計算 / map / sort,使用 useMemo 緩存結果。


5. 減少 Context 過度渲染

  • Context 更新會觸發所有消費組件刷新。

  • 優化手段:

    • 拆分 Context

    • 或配合 selector hook(比如 use-context-selector


🔹 二、構建與加載優化

1. 代碼分割

  • React.lazy + Suspense 路由級別拆分。

  • dynamic import() 工具函數/圖表庫等按需加載。

2. Tree Shaking

  • 確保打包工具能清除無用代碼(Webpack、Vite 默認支持 ES Module)。

3. 壓縮與緩存

  • 使用 gzip 或 brotli 壓縮。

  • 配置瀏覽器緩存策略(靜態資源 hash 命名)。

4. 使用 CDN / 按需加載依賴

  • 比如 antd 用 babel-plugin-importunplugin-import 按需引入。


🔹 三、運行時優化

1. 避免頻繁狀態更新

  • 合并 setState

  • 使用 批量更新(React 18 自動啟用)

2. 合理選擇狀態存儲位置

  • 不要把所有狀態放在全局(Redux/Context)。

  • 局部狀態用 useState 更高效。

3. 使用 Web Worker

  • 把耗時計算移到 Worker,避免阻塞主線程。

4. 節流與防抖

  • 對滾動、輸入等高頻事件處理函數加上 debounce/throttle


🔹 四、UI & 交互優化

1. 圖片優化

  • 懶加載(<img loading="lazy" />)。

  • 使用合適的格式(WebP、AVIF)。

2. 骨架屏 / 占位符

  • 提升用戶感知性能,避免白屏。

3. Suspense + Streaming SSR

  • React 18 支持流式渲染,首屏更快。


🔹 五、開發階段調優工具

  • React Profiler:分析組件渲染耗時。

  • why-did-you-render:檢測不必要的 re-render。

  • Performance 面板(Chrome DevTools):檢查內存泄漏、渲染瓶頸。


📌 總結建議(針對你做的性能平臺項目):

  1. 表格 / 列表頁面 → 用 react-window 做虛擬滾動。

  2. 路由層React.lazy 懶加載頁面,避免首頁加載過大。

  3. 數據計算(統計 / 過濾) → 用 useMemo 緩存。

  4. 表格操作按鈕 → 用 React.memo 包裹,減少子組件重復渲染。

  5. ECharts 圖表 → 按需 import(只加載需要的圖表類型)。


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

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

相關文章

騰訊云OpenCloudOS 9系統部署OpenTenBase數據庫詳細教程

OpenTenBase簡介OpenTenBase是一個關系型數據庫集群平臺&#xff0c;提供寫入可靠性和多節點數據同步功能。可以在一臺或多臺主機上配置OpenTenBase&#xff0c;并將數據存儲在多個物理主機上。OpenTenBase架構組件&#xff1a;Coordinator Node (CN)&#xff1a;應用程序訪問入…

【計算機視覺】Pixel逐像素分類Mask掩碼分類理解摘要

目標檢測和實例分割是計算機視覺的基本任務。目標檢測的傳統方法中通常利用邊界框技術進行對象定位&#xff0c;然后利用逐像素分類為這些本地化實例分配類。但是當處理同一類的重疊對象時&#xff0c;或者在每個圖像的對象數量不同的情況下&#xff0c;這些方法通常會出現問題…

C++之stack類的代碼及其邏輯詳解

1. stack介紹及使用方法stack是一種后進先出的數據結構&#xff0c;所以在C的STL庫中也同樣遵循了這一點&#xff0c;我們在使用的時候不支持隨機訪問或迭代器遍歷。注意事項調用 top() 或 pop() 前需確保棧非空&#xff0c;否則可能引發未定義行為。stack 沒有 clear() 函數&a…

Spring Cache實現簡化緩存功能開發

一. 介紹Spring Cache 是 Spring 框架提供的緩存抽象層&#xff0c;它簡化了在應用中添加緩存功能的開發工作。通過 Spring Cache&#xff0c;開發者無需關注具體緩存實現的細節&#xff0c;只需通過注解就能快速實現方法級別的緩存管理。核心特點1. 與具體緩存實現解耦&#x…

Lombok(簡化Java當中的開發)

Lombok概述 以前的Java項目中,充斥著太多不友好的代碼:POJO的getter/setter/toString/構造方法;打印日志;I/O流的關閉操作等等,這些代碼既沒有技術含量,又影響著代碼的美觀,Lombok應運而生。 LomBok可以通過注解,幫助開發人員消除JAVA中尤其是POJO類中的冗長代碼。 使…

【DeepSeek】公司內網部署離線deepseek+docker+ragflow本地模型實戰

企業內部可能有些數據比較敏感&#xff0c;不能連接互聯網。本次實驗操作是將deepseek完全離線后遷移至內網使用&#xff0c;實驗基于Windows server 2022 datacenter系統安裝deepseek、docker、ragflow。 目錄使用VMware新建WIN2022虛擬機一、安裝DeepSeek模型二.安裝Docker使…

【軟考架構】面向服務的體系結構(SOA)深度解析

面向服務的體系結構&#xff08;SOA&#xff09;深度解析 面向服務的體系結構&#xff08;Service-Oriented Architecture, SOA&#xff09;是一種以服務為核心的軟件架構范式&#xff0c;通過標準化接口實現異構系統間的高效集成與協作。以下從概念定義、發展脈絡、技術演進、…

centos7中MySQL 5.7.32 到 5.7.44 升級指南:基于官方二進制包的原地替換式升級

目錄前言1. 升級概述1.1 升級背景1.2 升級目的1.3 升級方法概述1.4 升級策略與注意事項2. 升級準備2.1 備份工作2.2 下載目標版本2.3 停止 MySQL 服務3. 替換二進制文件3.1 解壓官方二進制包3.2 替換核心二進制文件3.3 更新共享庫4. 執行升級并驗證4.1 啟動 MySQL 服務4.2 監控…

數學七夕花禮(MATLAB版)

前言參考的視頻在抖音&#xff0c;電腦版的抖音一直登錄不了&#xff0c;用手機分享的鏈接如下所示。4.35 Iv.FH yTl:/ 04/04 復制打開抖音&#x1f440;數學送的七夕花禮&#xff0c;記得查收噢.# 七夕花禮請查收 ... https://v.douyin.com/H-YpOJCyQyg/rho4sin(8theta)公式&a…

LeetCode - 21. 合并兩個有序鏈表

題目 21. 合并兩個有序鏈表 思路 我會采用雙指針的方法&#xff0c;同時遍歷兩個鏈表&#xff0c;比較當前節點的值&#xff0c;將較小的節點添加到結果鏈表中。 具體思路是這樣的&#xff1a; 首先創建一個啞節點(dummy node)作為合并后鏈表的頭部&#xff0c;這樣可以簡…

ES01-環境安裝

ES01-環境安裝 文章目錄ES01-環境安裝1-參考網址2-知識總結1-參考網址 elasticsearch官網地址&#xff1a;https://www.elastic.co/安裝elasticsearch9.0.0參考&#xff1a;https://zhuanlan.zhihu.com/p/1920780524991017021安裝elasticsearch9.0.0參考&#xff1a;http://ww…

UI前端大數據可視化實戰策略:如何設計符合用戶認知的數據可視化界面?

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!UI前端大數據可視化實戰策略&#xff1a;如何設計符合用戶認知的數據可視化界面&#xff1f;數…

學習python第15天

其實前面學的根本不記得了&#xff0c;小丑.jpg&#xff0c;如果真的面試問到了估計也是一臉懵今日任務&#xff1a;JSON先認識一下JSON和JSONL文件記得之前在面試KIMI的時候&#xff0c;面試官就給我出了JSONL和EXCEL轉換的手撕代碼題&#xff0c;而那個時候&#xff0c;我連什…

Spring框架集成Kakfa的方式

Spring框架集成Kakfa的方式 springboot集成kafka的方式 添加maven依賴 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version> </dependency&g…

【藍橋杯 2024 省 Python B】繳納過路費

【藍橋杯 2024 省 Python B】繳納過路費 藍橋杯專欄&#xff1a;2024 省 Python B 算法競賽&#xff1a;圖論&#xff0c;生成樹&#xff0c;并查集&#xff0c;組合計數&#xff0c;kruskal 最小生成樹&#xff0c;乘法原理 題目鏈接&#xff1a;洛谷 【藍橋杯 2024 省 Python…

個性化導航新體驗:cpolar讓Dashy支持語音控制

文章目錄簡介1. 安裝Dashy2. 安裝cpolar3.配置公網訪問地址4. 固定域名訪問用 cpolar 讓 Dashy 管理個人導航站就是這么簡單&#xff01;三步輕松搞定&#xff1a;在電腦上安裝 Dashy&#xff0c;拖拽添加常用網站&#xff0c;運行 cpolar 生成遠程訪問鏈接。這個方法不僅免費&…

SQL學習記錄

基本的&#xff0c;增、刪&#xff0c;改insert into table_name (列1, 列2,...) VALUES (值1, 值2,....)Delete from 表 where keyvalueupdate 表 set keyvalue,keyvalue where keyvalue查用的最多whereSELECT prod_name, prod_price FROM Products WHERE vend idDLLO1OR ve…

零基礎學C++,函數篇~

C基礎學習&#xff08;DAY_06&#xff09;函數1. 函數的定義與使用2. 函數參數傳遞3. 變量的聲明周期4. 函數的其他特性5. 函數的嵌套與遞歸函數 1. 函數的定義與使用 ? 在設計程序時&#xff0c;如果一段代碼重復進行某種操作或者完成一個特定的功能&#xff0c;就應該將這…

react+vite+ts 組件模板

1.創建項目npm create vitelatest my-app --template react-ts2.配置項目 tsconfig.json{"compilerOptions": {"target": "ES2020","useDefineForClassFields": true,"lib": ["ES2020", "DOM", "D…

C語言 - 輸出參數詳解:從簡單示例到 alloc_chrdev_region

C語言中的輸出參數詳解&#xff1a;以 alloc_chrdev_region 為例 在學習 C 語言函數調用時&#xff0c;我們常常接觸到“輸入參數”&#xff0c;比如把一個數字傳給函數&#xff0c;讓函數幫我們算出結果。但有時候可能會發現&#xff0c;有些函數除了返回值之外&#xff0c;還…