網站首頁 編程語言 正文
前言
本專欄的另一篇文章,講到了 useMemo 有一定的開銷,不能濫用,本篇文章講解兩個簡單實用的優化組件渲染性能的方法:
- 狀態下移
- 內容提升
在講解這兩種方法之前,我們需要先手動創建一個有嚴重渲染性能的組件,如下所示:
import { useState } from 'react';
export default function App() {
let [color, setColor] = useState('red');
return (
<div>
<input value={color} onChange={(e) => setColor(e.target.value)} />
<p style={{ color }}>Hello, world!</p>
<ExpensiveTree />
</div>
);
}
function ExpensiveTree() {
let now = performance.now();
while (performance.now() - now < 100) {
// Artificial delay -- do nothing for 100ms
}
return <p>I am a very slow component tree.</p>;
}
很顯然,當 App 組件內的狀態發生了改變,ExpensiveTree 組件會 re-render, 事實上 ExpensiveTree 組件的 props、state 并未發生改變,這并不是我們期望的結果,下面將提供兩種簡單的方法,提升組件渲染的性能;
狀態下移
export default function App() {
let [color, setColor] = useState('red');
return (
<div>
<input value={color} onChange={(e) => setColor(e.target.value)} />
<p style={{ color }}>Hello, world!</p>
<ExpensiveTree />
</div>
);
}
我們可以看到以上 ExpensiveTree 組件并不依賴 App 組件內部的狀態,因此我們是否可以考慮,將依賴 color 的元素抽離到一個依賴 color 的組件中呢?
下面是實踐后的代碼:
export default function App() {
return (
<>
<Form />
<ExpensiveTree />
</>
);
}
function Form() {
let [color, setColor] = useState('red');
return (
<>
<input value={color} onChange={(e) => setColor(e.target.value)} />
<p style={{ color }}>Hello, world!</p>
</>
);
}
此時,將依賴 color 的元素提取到了 Form 組件中,Form 組件內部的狀態不再影響 ExpensiveTree 組件的渲染,問題便得到了解決
內容提升
export default function App() {
let [color, setColor] = useState('red');
return (
<div style={{ color }}>
<input value={color} onChange={(e) => setColor(e.target.value)} />
<p>Hello, world!</p>
<ExpensiveTree />
</div>
);
}
以上情況是高開銷組件 ExpensiveTree 的父節點依賴 color,此時顯然狀態下移是行不通的,但是還有另外一種辦法:
export default function App() {
return (
<ColorPicker>
<p>Hello, world!</p>
<ExpensiveTree />
</ColorPicker>
);
}
function ColorPicker({ children }) {
let [color, setColor] = useState("red");
return (
<div style={{ color }}>
<input value={color} onChange={(e) => setColor(e.target.value)} />
{children}
</div>
);
}
此時和狀態提升是完全相反的,將依賴 color 的元素提升到了 ColorPicker 組件中,而不依賴 color 的元素以 children prop 的形式傳入了 ColorPicker ,當組件內部的狀態改變時:
- ColorPicker 會重新渲染但是它仍然保存著
- ColorPicker 的 children 屬性未變化 React 并不會訪問那棵子樹。 因此,ExpensiveTree不會重新渲染。
本文提供的方法并不是新的創意,大家一定都有所實踐,但是我想表達的是,相比于濫用 useMemo,我們需要首先考慮使用這兩種提高組件渲染性能的方法;
原文鏈接:https://blog.csdn.net/qq_44588612/article/details/128018188
相關推薦
- 2023-01-23 Linux?paste命令用法匯總_linux shell
- 2022-04-20 Android實現將View轉化為圖片并保存到本地_Android
- 2022-10-17 詳解Go語言中單鏈表的使用_Golang
- 2022-05-20 利用PyQt5模擬實現網頁鼠標移動特效_python
- 2022-05-03 python中的map函數語法詳解_python
- 2022-04-25 jQuery利用鍵盤上下鍵移動表格內容_jquery
- 2022-05-04 shell腳本配合zabbix實現tomcat的故障自愈功能_linux shell
- 2023-02-18 SQLserver中的any和all運算符的用法_MsSql
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支