一文講清楚React性能優化

文章目錄

  • 一文講清楚React性能優化
  • 1. React性能優化概述
  • 2. React性能優化
    • 2.1 render優化
    • 2.2 較少使用內聯函數
    • 2.3 使用React Fragments避免額外標記
    • 2.4 使用Immutable
    • 上代碼
    • 2.5 組件懶加載
    • 2.6 服務端渲染
    • 2.7 其他優化手段

一文講清楚React性能優化

1. React性能優化概述

React通過引入VirtualDOM,再加上diff算法,讓渲染性能得到了極大的提升,但是我們依然可以通過很多方法,將性能進一步的 提升

2. React性能優化

2.1 render優化

直接看這篇文章一文講清楚React的render優化,包括shouldComponentUpdate、PureComponent和memo

2.2 較少使用內聯函數

  • 使用內聯函數會導致每次render時都創建新的函數實例,造成一定的性能影響,我們應盡量在render外實例化函數,然后再render中綁定就行

// 使用內聯函數
class App extends React.Component{render(){return(<div><button onClick={()=>{/* do something */}}></button></div>)}
}
// 是使用內斂函數
class App extends React.Component{handleClick=()=>{/* do something */}render(){return(<div><button onClick={this.handleClick}></button></div>)}
}

2.3 使用React Fragments避免額外標記

因為React要求我們每個組件具有唯一父標簽,所以我們經常會在最外層嵌套一個div,但是這樣會增加DOM消耗
如果我們只是為了滿足規則,而不需要在最外層標簽做人也業務處理,則可以使用<>React Fragments來代替div

class App extends from React.Component{render(){return(<><span>use React Fragments</span></>)}
}

2.4 使用Immutable

  • 首先,Immutable是一個js庫,他的作用是讓我們在進行對象引用時,不用拷貝整個原對象,而是截取當前節點及父節點,其他節點實現共享,形成一種不可變的數據結構
  • 她提供了主要想Map(主要處理對象),Set(主要處理Array)等來操作對象
  • 用之前先安裝 npm install immutable
  • 我們用Map來舉例,
  • 主要用法
  • Map(obj)
  • set(name,value)
  • get(name)
  • toJS(轉回普通對象)
  • 上代碼

import React, { Component } from 'react';
import {Map} from 'immutable'
class App extends Component {state={info:Map({name:"tom",age:20,hobbit:Map({likeone:"basketball",liketwo:"football"})})}render() {return (<div>App<button onClick={()=>{this.setState({info:this.state.info.set("name","newTom")})}}>修改</button>{this.state.info.get("name")}<Child hobbit={this.state.info.get("hobbit")} ></Child> </div>);}
}
class Child extends Component{shouldComponentUpdate(nextProps,nextState){//判斷hobbit的值是否更新if(this.props.hobbit===nextProps.hobbit){return false;}return true;}render(){return(<div>Child</div>);}componentDidUpdate(){console.log("子組件更新了");}
}
export default App;
  • 實現不必要的render渲染

2.5 組件懶加載

  • 我們在使用webpack的時候都知道,webpack支持代碼拆分的能力,打包不同的bundle,然后再需要的時候動態加載,而不是一次性全部加載,減少初始包的大小
  • React使用Suspense和lazy組件實現代碼的拆分,即懶加載
  • 上代碼
const lazyComponent=React.lazy(()=>import(/* component name */))
function App(props){<React.Suspense><lazyComponent></lazyComponent></React.Suspense>
}

2.6 服務端渲染

  • 我們可以使用服務端渲染的方式,加速首屏加載
  • 可以使用Node服務,調用React.renderToString
  • 也可以直接使用next.js實現服務端渲染

2.7 其他優化手段

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

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

相關文章

3.0 - 指針-序列化

一、關于Serialize的使用 可以使用該指令臨時將用戶程序的多個結構化數據項保存到緩沖區中(最好位于全局數據塊中)。用于保存轉換后數據的存儲區的數據類型必需為 ARRAY of BYTE 或 ARRAY of CHAR 相當于把一個struct或其他自定義類型變成一個字節數組。 比如我有好幾個結構體…

【論文精讀】基于共識的分布式量子分解算法用于考慮最優傳輸線切換的安全約束機組組合

本次分析的論文《Consensus‐Based Distributed Quantum Decomposition Algorithm for Security‐Constrained Unit Commitment Considering Optimal Transmission Switching》于2025年6月25日在《Advanced Quantum Technologies》期刊上公開發表。本文提出了一個新的基于共識的…

MyBatis-Flex代碼生成

引入依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok<…

知網論文批量下載pdf格式論文,油猴腳本

任務描述 今天收到一個任務&#xff0c;在知網上&#xff0c;把一位專家所有的論文全都下載下來&#xff0c;要保存為PDF格式。 知網不支持批量導出PDF格式論文。一個一個下載PDF&#xff0c;太繁瑣了。 解決方案&#xff1a;找到一個油猴腳本&#xff0c;這個腳本可以從知網…

低代碼平臺:驅動項目管理敏捷開發新范式

隨著企業數字化轉型加速&#xff0c;項目管理系統已從單一任務跟蹤工具到集成流程自動化、資源調度、跨團隊協作與風險監控的綜合平臺&#xff0c;項目管理系統的功能復雜度持續提升。然而&#xff0c;根據Gartner 2024年研究報告顯示&#xff0c;約60%的項目管理系統因未能有效…

圖機器學習(11)——鏈接預測

圖機器學習&#xff08;11&#xff09;——鏈接預測0. 鏈接預測1. 基于相似性的方法1.1 基于指標的方法1.2 基于社區的方法2. 基于嵌入的方法0. 鏈接預測 鏈接預測 (link prediction)&#xff0c;也稱為圖補全&#xff0c;是處理圖時常見的問題。具體而言&#xff0c;給定一個…

簡單2步配置CadenceSkill開發編輯器,支持關鍵字高亮

Cadence 使用過程中難免會與skill打交道&#xff0c;有時候網上找到的開源skill&#xff0c;想要查看或者編輯一下&#xff0c;常規的txt編輯器沒有關鍵字高亮&#xff0c;看起來極為不方便。 利用Sublime Text可以很快速配置出支持skill關鍵字高亮的編輯器。 一、安裝 Sublime…

Leetcode刷題營第三十三題:對稱二叉樹

101. 對稱二叉樹 給你一個二叉樹的根節點 root &#xff0c; 檢查它是否軸對稱。 示例 1&#xff1a; 輸入&#xff1a;root [1,2,2,3,4,4,3] 輸出&#xff1a;true示例 2&#xff1a; 輸入&#xff1a;root [1,2,2,null,3,null,3] 輸出&#xff1a;false 提示&#xff1a;…

day055-Dockerfile與常用指令

文章目錄0. 老男孩思想-女性的第一需求1. Dockerfile1.1 Dockerfile的基本結構1.2 案例-制作小鳥飛飛鏡像1.2.1 編寫Dockerfile文件1.2.2 構建鏡像1.2.3 啟動容器1.3 Dockerfile常用指令1.4 面試題&#xff1a;Dockerfile中CMD和ENTRYPOINT的區別&#xff1f;1.5 案例-制作zrlo…

Spring Boot 應用優雅停機與資源清理:深入理解關閉鉤子

在開發和部署 Spring Boot 應用程序時&#xff0c;除了關注其啟動和運行&#xff0c;理解如何實現**優雅停機&#xff08;Graceful Shutdown&#xff09;**也同樣至關重要。優雅停機意味著在應用程序關閉時&#xff0c;能夠有序地釋放資源、完成正在進行的任務&#xff0c;并避…

淘寶扭蛋機小程序開發:重構電商娛樂化體驗的新范式

在電商行業同質化競爭加劇的當下&#xff0c;消費者對購物體驗的期待已從“功能滿足”轉向“情感共鳴”。淘寶扭蛋機小程序憑借“盲盒式隨機獎勵游戲化交互”的創新模式&#xff0c;成為撬動年輕用戶消費力的新支點。其開發邏輯不僅是對傳統電商的升級&#xff0c;更是對“娛樂…

YOLO演變史(一)

在YOLOV1發布后&#xff0c;作者并沒有滿足于此&#xff0c;而是持續對YOLO進行了改進。 YOLOV2&#xff1a;Better, Faster, Stronger YOLOv2&#xff08;又稱YOLO9000&#xff09;發表于2017年CVPR&#xff0c;是YOLO系列的第二代版本。其論文標題“Better, Faster, Stronger…

專題:2025智能體研究報告|附70份報告PDF、原數據表匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p43035 智能體正在改寫商業規則&#xff1a;某城商行的智能客服用公有云部署&#xff0c;把單筆交互成本從5.7元砍到1.2元&#xff0c;投訴率直降42%&#xff08;《賽迪智庫&#xff1a;2025全球智能體進展報告》P24&#xff09;&…

Axios 完整功能介紹和完整示例演示

Axios 是一個基于 Promise 的現代化 HTTP 客戶端庫&#xff0c;用于瀏覽器和 Node.js 環境。它提供了簡潔的 API 和強大的功能&#xff0c;是前端開發中最常用的網絡請求工具之一。核心功能 瀏覽器 & Node.js 雙平臺支持 瀏覽器中使用 XMLHttpRequestNode.js 中使用 http 模…

math.h函數

math.c函數作用 1. 基本三角函數&#xff08;參數為弧度&#xff09; sin(double x)&#xff1a;計算正弦值。cos(double x)&#xff1a;計算余弦值。tan(double x)&#xff1a;計算正切值。asin(double x)&#xff1a;反正弦&#xff08;返回值范圍&#xff1a;[-π/2, π/2]&…

在Next.js里玩轉pdf預覽

1.背景在項目開發中&#xff0c;pdf預覽是一個很常見的業務。各大公司為了保護自己的知識產權&#xff0c;也會對pdf預覽進行限制&#xff0c;比如&#xff1a;不允許下載、打印&#xff0c;不允許提取文字等等。要想在實現預覽功能的基礎上還要附加這些限制&#xff0c;有很多…

算法競賽備賽——【圖論】求最短路徑——Floyd算法

floyd算法 基于動態規劃 應用&#xff1a;求多源最短路 時間復雜度&#xff1a;n^3 dijkstra&#xff1a;不能解決負邊權 floyd&#xff1a;能解決負邊權 不能解決負邊權回路問題 求最短路徑&#xff1a;dijkstra bfs floyd 思路 1.讓任意兩點之間的距離變短&#xff1a;引入…

雙指針(滑動窗口)相關算法題

雙指針算法有時候也叫尺取法或者滑動窗口&#xff0c;是?種優化暴力枚舉策略的手段&#xff1a;當我們發現在兩層 for 循環的暴力枚舉過程中&#xff0c;兩個指針是可以不回退的&#xff0c;此時我們就可以利用兩個指針不回退的性質來優化時間復雜度。因為雙指針算法中&#x…

ScratchCard刮刮卡交互元素的實現

效果展示 刮刮卡是?種常見的網頁交互元素&#xff0c;通過模擬物理世界的刮涂層來揭示下方的內容。這種效果主要依賴于HTML5的 元素來實現。以下是?個基于TypeScript的刮刮卡實現示例&#xff0c;包括配置項、初始化方法和核心的刮開邏輯。下面是展示的效果部分刮開效果&…

【Python LeetCode 專題】熱題 100,重在思路

哈希1. 兩數之和49. 字母異位詞分組128. 最長連續序列雙指針283. 移動零11. 盛最多水的容器15. 三數之和42. 接雨水滑動窗口3. 無重復字符的最長子串438. 找到字符串中所有字母異位詞子串560. 和為 K 的子數組239. 滑動窗口最大值普通數組53. 最大子數組和56. 合并區間189. 輪轉…