React: memo

React.memo 允許你的組件在 props 沒有改變的情況下跳過重新渲染。

const MemoizedComponent = memo(SomeComponent, arePropsEqual?)

React 通常在其父組件重新渲染時重新渲染一個組件。你可以使用 memo 創建一個組件,當它的父組件重新渲染時,只要它的新 props 與舊 props 相同時,React 就不會重新渲染它。這樣的組件被稱為 記憶化的(memoized)組件。

一、未使用memo

1. 代碼
import { useState } from "react";// 未做memo記憶化之前
function Son() {console.log('子組件重新渲染');return (<><div>子組件</div></>)
}function App() {const [count1, setCount1] = useState(0);return (<><div>父組件:{count1} <button onClick={() => setCount1(count1 + 1)}>+</button></div><Son /></>)
}export default App;
2.運行效果

在這里插入圖片描述

二、使用memo

1. 代碼
import { memo,useState } from "react";// 使用memo
const MemoSon = memo(function Son() {console.log('子組件重新渲染');return (<><div>子組件</div></>)
})function App() {const [count1, setCount1] = useState(0);return (<><div>父組件:{count1} <button onClick={() => setCount1(count1 + 1)}>+</button></div><MemoSon /></>)
}export default App;
2.運行效果

在這里插入圖片描述

三、props的比較機制

在使用 memo 緩存組件之后,React會對 每一個prop 使用 Object.is 比較新值和老值,返回true,表示沒有變化

  1. prop 是簡單類型
    Object.is(3, 3) => true 沒有變化

  2. prop 是引用類型(對象/數組)
    Object.is([], []) => false 有變化,React 只關心引用是否變化

四、 prop為引用類型,如何避免子組件重新渲染?

當prop為簡單類型時很好理解,但當prop是引用類型時,即使prop的值內容不變,但是引用地址不同,也會觸發重新渲染,如下示例:

1. 代碼
import { memo, useState } from "react";// 3. prop為引用類型
const MemoSon = memo(function Son({list}) {console.log('子組件再次渲染');return (<><div>子組件:{list}</div></>)
})function App() {const [count1, setCount1] = useState(0);// 3. prop為引用類型const list = [1,2,3];return (<><div>父組件:{count1} <button onClick={() => setCount1(count1 + 1)}>+</button></div>{/* 3. prop為引用類型 */}<MemoSon list={list} /></>)
}export default App;
2. 效果

在這里插入圖片描述

3. 使用useMemo 緩存list
	...// 保證引用穩定 => useMemo 在組件渲染的過程中緩存一個值const list = useMemo(() => {return [1,2,3];}, []);...
4. 效果

在這里插入圖片描述

五、完整代碼

import { memo, useMemo, useState } from "react";// 1. 未使用memo
/* function Son() {console.log('子組件再次渲染');return (<><div>子組件</div></>)
} */// 2. memo 記憶化后
/* const MemoSon = memo(function Son() {console.log('子組件再次渲染');return (<><div>子組件</div></>)
}) */// 3. prop為引用類型
// 傳遞引用類型的 prop,比較的是新值和舊值的引用是否相等,當父組件的函數重新執行時,實際上形成的是新的引用
const MemoSon = memo(function Son({list}) {console.log('子組件再次渲染');return (<><div>子組件:{list}</div></>)
})function App() {const [count1, setCount1] = useState(0);// 3.1 prop為引用類型 直接定義一個 list// const list = [1,2,3];// 3.2 prop為引用類型,使用 useMemo 緩存list// 保證引用穩定 => useMemo 在組件渲染的過程中緩存一個值const list = useMemo(() => {return [1,2,3];}, []);return (<><div>父組件:{count1} <button onClick={() => setCount1(count1 + 1)}>+</button></div>{/* // 1. 未使用memo */}{/* <Son /> */}{/* // 2. 使用memo */}{/* <MemoSon /> */}{/* 3. prop為引用類型 */}<MemoSon list={list} /></>)
}export default App;

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

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

相關文章

centos7服務器采用局域網內筆記本代理上網

一、背景 某臺服務器操作系統是centos 7&#xff0c;不能上網。我想在上面裝個ftp軟件&#xff1a;vsftpd。 二、思路 要安裝這個軟件&#xff0c;有2種方案 1&#xff09;設置該臺centos7可以上網 2&#xff09;離線安裝vsftpd 鑒于各種依賴&#xff0c;萬一因為依賴不全或…

《海峽科技與產業》是什么級別的期刊?是正規期刊嗎?能評職稱嗎?

問題解答 問&#xff1a;《海峽科技與產業》期刊是什么級別&#xff1f; 答&#xff1a;國家級 主管單位&#xff1a;中華人民共和國科學技術部 主辦單位&#xff1a;科技部海峽兩岸科學技術交流中心 問&#xff1a;《海峽科技與產業》影響因子&#xff1f; 答&#xff1a;…

相位;傅里葉變換和傅里葉級數是什么;歐拉公式是什么,和傅里葉關系;

目錄 相位 傅里葉變換公式使用舉例 實際案例 傅里葉變換和傅里葉級數是什么

隨筆:棋友們

我是在小學二年級學會中國象棋的&#xff0c;準確說&#xff0c;是學會象棋的下棋規則的&#xff0c;師傅是二舅。我最早的對手就是同學波仔。波仔比我略早學會象棋&#xff0c;總用連珠炮欺負我&#xff0c;開局幾步棋就把我將死。我不知道怎么破解。輪到我先走時&#xff0c;…

扭虧為盈的賽力斯,真正進入穩態了嗎?

“72小時內大定破1萬臺”。5月15日&#xff0c;問界新M5開啟全國大規模交付&#xff0c;從當前取得的成績來看&#xff0c;賽力斯的“富貴”似乎還將延續。 其實&#xff0c;此前基于問界新M7等車型的爆火&#xff0c;賽力斯已經找到了創收軌道。財報顯示&#xff0c;2024年一…

alist網盤自動同步

alist網盤自動同步 alist可以設置目錄定時轉存到各個網盤&#xff0c;做到夸網盤&#xff0c;多備份的效果可以將自己掛載的alist 下的各個目錄相互間進行同步&#xff0c;原理是采用alist原始api調用執行同步原理1.匹配文件名稱是否相同,2.文件大小是否相同&#xff0c;相同會…

一文詳細解析Google編碼規范工具cpplint的下載安裝與使用

目錄 一、什么是cpplint 二、cpplint能實現的功能 三、cpplint的下載與使用 1、配置python環境 2、安裝cpplint 四、cpplint常用命令講解 1、常用命令查看 2、常用命令詳解 3、命令使用方式 五、 cpplint的實用技巧 1、集成cpplint 1.1、修改調用接口. 1.2、直接把…

數據結構(C):樹的概念和二叉樹初見

目錄 &#x1f37a;0.前言 1.樹概念及結構 2.認識一棵樹 3.樹的表示 3.1樹在實際中的運用&#xff08;表示文件系統的目錄樹結構&#xff09; 4.二叉樹 4.1特殊的二叉樹 4.2二叉樹的性質 &#x1f48e;5.結束語 &#x1f37a;0.前言 言C之言&#xff0c;聊C之識&…

卷積模型的剪枝、蒸餾---蒸餾篇--NST特征蒸餾(以deeplabv3+為例)

本文使用NST特征蒸餾實現deeplabv3+模型對剪枝后模型的蒸餾過程; 一、NST特征蒸餾簡介 下面是兩張疊加了熱力圖(heat map)的圖片,從圖中很容易看出這兩個神經元具有很強的選擇性:左圖的神經元對猴子的臉部非常敏感,右側的神經元對字符非常敏感。這種激活實際上意味著神經…

程序員績效管理-序言

開辟一個新專欄專門討論程序員績效管理。作為軟件開發企業&#xff0c;公司的命脈掌握在程序員手中。程序員的績效管理是個超級難題。小張和老王專欄介紹了兩個典型的人員。但是這是兩個虛擬的極端人員&#xff0c;大部分開發人員沒有那么容易分辨。1個任務&#xff0c;應該1天…

LabVIEW軟件開發工程師需要具備哪些能力與素質?

成為一名優秀的LabVIEW軟件開發工程師&#xff0c;需要具備以下能力與素質&#xff1a; 技術能力 LabVIEW編程技能&#xff1a; 精通LabVIEW編程&#xff0c;能夠熟練使用其圖形化編程界面。熟悉LabVIEW中的各種功能模塊和工具包&#xff0c;如數據采集&#xff08;DAQ&#x…

如何配置Nacos的健康檢查參數?

在微服務架構中&#xff0c;服務注冊與發現以及健康檢查是至關重要的組件。Nacos&#xff0c;作為阿里巴巴開源的一個更易于構建云原生應用的動態服務發現、配置和服務管理平臺&#xff0c;廣泛應用于微服務架構中。在Nacos中&#xff0c;服務的健康檢查是一個核心功能&#xf…

【Python】使用MySQL綜合案例

數據說明: 一月份各省銷售數據&#xff1a;csv格式 二月份各省銷售數據&#xff1a;json格式 實現要求&#xff1a;將兩個文件中的數據存儲到數據庫中&#xff0c;并反向從數據庫中讀取數據存儲為json格式文件 本文提供數據 完成案例所需基礎 【Python】基礎知識(函數與數…

C++ 日志庫 log4cpp 編譯、壓測及其范例代碼 [全流程手工實踐]

文章目錄 一、 log4cpp官網二、下載三、編譯1.目錄結構如下2.configure 編譯3.cmake 編譯 四、測試五、壓測源碼及結果1.運行環境信息2.壓測源碼3.壓測結果 文章內容&#xff1a;包含了對其linux上的完整使用流程&#xff0c;下載、編譯、安裝、測試用例嘗試、以及一份自己寫好…

Qt | QTimer 類(計時器)

01、相關知識回顧 Qt C++ | QTimer經驗總結Qt | QDateTimeEdit、QDateEdit類和QTimeEdit類02、QTimer 類 1、QTimer 類是 QObejct 的直接子類,該類用于實現計時器,QTimer 類未繼承自 QW

IT革新狂潮:引領未來的技術趨勢

方向一&#xff1a;技術革新與行業應用 當前現狀&#xff1a; 量子計算&#xff1a;量子計算的研究正在加速&#xff0c;盡管目前仍處于初級階段&#xff0c;但其在藥物研發、加密技術和材料科學等領域的應用潛力已被廣泛認可。 虛擬現實&#xff08;VR&#xff09;與增強現實…

湖南大學OS-2018期末考試(不含解析)

前言 不知道哪里翻出來的一張&#xff0c;看著確實像期末考卷&#xff0c;暫且放一下。或許做過&#xff0c;或許沒做過。 總之答案不記得了。做完可以評論區發一下或者找我發出來。 共6道大題。 一、(30%) 1. &#xff08;6%&#xff09; 進程間通信的兩種方法分別是什么&…

完成所有任務的最少時間 - (LeetCode)

前言 今天也是很無精打采的一天&#xff0c;早上看到這道題&#xff0c;都有點懵逼&#xff0c;開始也不懂如何入手&#xff0c;既然自己搞不定&#xff0c;就順便測試了一下AI吧&#xff0c;測試了通義千問和文心一言&#xff0c;把題目拿去那里問&#xff0c;可以把解題思路…

DRF 跨域問題

【一】說明 CORS&#xff08;跨來源資源共享&#xff0c;Cross-Origin Resource Sharing&#xff09;是一種瀏覽器技術的規范&#xff0c;旨在解決瀏覽器同源策略&#xff08;Same-Origin Policy&#xff09;的限制&#xff0c;使得Web服務可以從不同的網域&#xff08;源&…

error Error: certificate has expired

用yarn命令安裝依賴的時候遇到報錯&#xff1a; 原因&#xff1a;可能是開了服務器代理訪問導致ssl安全證書失效 解決方法&#xff1a; 在終端輸入 yarn config set "strict-ssl" false -g yarn config set "strict-ssl" false -g 然后再安裝依賴就不…