成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇帶給你 React.memo 如何使用?

開發(fā) 前端
React.memo 是一個 高階組件。所謂高階組件,其實指的就是一個接收組件并返回一個組件的函數(shù)。起名參考了高階函數(shù),但確實花里胡哨了一些。

大家好,我是前端西瓜哥。

最近做的新功能有性能問題,所以我想嘗試優(yōu)化一下 React 組件的性能。下面我們來好好學(xué)習(xí)一下 React.memo 的用法。

組件狀態(tài)更新和重渲染

當(dāng)某個組件里的狀態(tài)發(fā)生改變時,React 會調(diào)用該組件的 render 方法,生成新的 React 元素樹,和原來的虛擬 DOM 對比,找出不同的地方然后給真實的 DOM 打補丁。

如果有子組件,它也會被重新渲染。

這里有一個問題:有些子組件其實并沒有發(fā)生狀態(tài)改變,也被重新渲染,占用了 CPU 資源。

雖然這個操作是不必要的,但 React 并不能知道傳給子組件的 props 是否發(fā)生了改變。

但 React 提供了 React.memo() 方法,希望你能通過它來告知 React 該組件是否跳過重渲染。

React.memo

React.memo 是一個 高階組件。

所謂高階組件,其實指的就是一個接收組件并返回一個組件的函數(shù)。起名參考了高階函數(shù),但確實花里胡哨了一些。

React.memo 的作用是 緩存 組件,它會對傳入的組件加上緩存功能生成一個新組件,然后返回這個新組件。

在傳給組件的 props 的屬性和值沒有發(fā)生改變的情況下,它會使用最近一次緩存的結(jié)果,而不會進行重新的渲染,實現(xiàn)跳過組件渲染的效果。

下面是一個示例:

const Comp = ({ color }) => {  return (    <div>      <div>{color}</div>    </div>  );};// 生成一個可以緩存結(jié)果的組件const MemoriedComp = React.memo(Comp);

當(dāng)我們使用 MemoriedBox 時,如果傳入的 props.color 保持不變的話,MemoriedBox 組件就不會發(fā)生重渲染。

這里有一個演示例子:
https://codesandbox.io/s/react-memo-huan-cun-ce-shi-k96vd4。

保證 props 的有效對比

比較算法

React.memo 判斷是否使用緩存,默認使用的是淺比較,也就是只比較第一層的 key。

shallowEqual 主要是通過 Object.is 來對比。源碼實現(xiàn)地址如下:

https://github.com/facebook/react/blob/HEAD/packages/shared/shallowEqual.js。

有時候我們希望自定義比較方法,這時候我們可以使用 React.memo 方法的第二個參數(shù),傳入我們自定義的比較方法。

const isEqual(prevProps, nextProps) {  // 自定義對比方法}const MemoriedComp = React.memo(Comp, isEqual);

自定義比較方法會拿到兩參數(shù):舊的和新的 props 對象,然后根據(jù)該方法的返回值來決定是否使用緩存。如果為真值,使用緩存,否則重新渲染并把新的渲染結(jié)果緩存下來。

假設(shè)我們有一個 prop 是數(shù)組,但因為聲明語句寫在組件里,所以每次渲染時都會生成一個指向新的內(nèi)存空間的另一個數(shù)組,導(dǎo)致新舊 prop 指向不同的內(nèi)存對象,但它們的數(shù)組元素卻是依次相等。

[1, 2] === [1, 2] // false

有時候我們想將它們認為 “相同”,能夠觸發(fā) React.memo 方法的緩存。

用淺比較會返回 false,進行重渲染,不符合我們的預(yù)期。這時候就可以使用自己實現(xiàn)的 深比較(深度遞歸比較),可以考慮使用比較有名的 lodash.isEqual。

緩存函數(shù)

對于數(shù)組和普通對象,我們可以用深比較來判斷 “相等”。但對于函數(shù)組件中每次都會被重新構(gòu)建的函數(shù),顯然是行不通的。函數(shù)沒有結(jié)構(gòu)。

對于函數(shù),我們可以使用 useCallback。

const Comp = () => { const onClick = React.useCallback(() => {  if (isOk) sumbit(); }, [isOk])    return (   <div>     <Button onClick={onClick}></Button>    </div>  )}

useCallback 接受一個函數(shù)和一個依賴項數(shù)組,當(dāng)依賴項數(shù)組里的元素沒有改變時,會使用最后一次緩存的函數(shù),否則會使用傳入的新函數(shù)。

除了用 useCallback 緩存函數(shù),我們還可以用 useMemo 來緩存其他的對象值。

避免負優(yōu)化

  • 只渲染一次,之后都不會更新的組件,不要使用 React.memo。
  • props 每次都會改變的組件,不要使用 React.memo,使用 React.memo 只會帶來不必要的新舊 props 比較和無意義的緩存。
  • 組件如果很簡單,不建議使用 React.memo,并不能帶來多大提升,而使用 React.memo 本身就有心智負擔(dān)。
  • 如果你無法很好地量化性能,不建議使用 React.memo。

結(jié)尾

React.memo 可以幫助我們跳過一些不必要的組件渲染。但要維護好對象類型 prop 的不改變,確實對我們造成不少的心智負擔(dān)。

React.memo 并不是一定會有正收益的,因為緩存也是有成本的。

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2022-03-22 09:09:17

HookReact前端

2022-04-18 08:57:32

React 18前端

2022-03-24 12:28:03

React 17React 18React

2023-03-29 07:45:58

VS編輯區(qū)編程工具

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2024-04-19 08:30:27

BitmapRedis數(shù)據(jù)處理

2021-09-13 07:46:06

Kubectl Kubernetes 工具

2022-03-03 22:00:19

Hooks函數(shù)組件React

2022-03-02 08:52:49

PostmangRPCAPI調(diào)試

2021-01-26 06:58:03

AnsibleCeph集群運維

2021-06-21 14:36:46

Vite 前端工程化工具

2021-01-28 08:55:48

Elasticsear數(shù)據(jù)庫數(shù)據(jù)存儲

2021-04-14 14:16:58

HttpHttp協(xié)議網(wǎng)絡(luò)協(xié)議

2021-04-08 11:00:56

CountDownLaJava進階開發(fā)

2021-07-21 09:48:20

etcd-wal模塊解析數(shù)據(jù)庫

2022-04-29 14:38:49

class文件結(jié)構(gòu)分析

2024-06-13 08:34:48

2021-03-12 09:21:31

MySQL數(shù)據(jù)庫邏輯架構(gòu)

2021-04-01 10:51:55

MySQL鎖機制數(shù)據(jù)庫

2022-02-17 08:53:38

ElasticSea集群部署
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 天天搞天天搞 | 粉嫩在线| 射欧美 | 欧美综合精品 | 99这里只有精品 | 日韩在线免费视频 | 午夜免费网站 | 91亚洲国产成人久久精品网站 | 欧美日韩中文国产一区发布 | 日韩欧美一区在线 | 午夜av免费| 国产福利在线 | 国产视频中文字幕 | 欧美爱爱视频 | 99re6在线 | 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | 91精品国产色综合久久 | 91精品在线播放 | 日韩成人精品一区二区三区 | 先锋资源站 | 成人小视频在线免费观看 | 国产精品久久久久无码av | 干干天天 | 麻豆精品国产91久久久久久 | 午夜寂寞福利视频 | 日本亚洲精品成人欧美一区 | 黄色成人在线网站 | 国产精品亚洲第一区在线暖暖韩国 | 天堂在线免费视频 | 最新国产精品 | 国产精品99久久久久久久vr | 波霸ol一区二区 | 精品久久久久香蕉网 | 精品久久久久久亚洲精品 | 国产成人福利视频 | 欧美一区二区视频 | 桃色五月 | 国产一二区视频 | 欧美另类视频在线 | 黄色三级在线播放 | 欧美一区二区免费 |