最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

react性能優(yōu)化useMemo與useCallback使用對比詳解

 更新時間:2022年08月12日 08:47:35   作者:152號  
這篇文章主要為大家介紹了react性能優(yōu)化useMemo與useCallback使用對比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

在介紹一下這兩個hooks的作用之前,我們先來回顧一下react中的性能優(yōu)化。在hooks誕生之前,如果組件包含內(nèi)部state,我們都是基于class的形式來創(chuàng)建組件。當(dāng)時我們也知道,react中,性能的優(yōu)化點(diǎn)在于:

調(diào)用setState,就會觸發(fā)組件的重新渲染,無論前后的state是否不同 父組件更新,子組件也會自動的更新 基于上面的兩點(diǎn),我們通常的解決方案是:使用immutable進(jìn)行比較,在不相等的時候調(diào)用setState;在shouldComponentUpdate中判斷前后的props和state,如果沒有變化,則返回false來阻止更新。

在hooks出來之后,我們能夠使用function的形式來創(chuàng)建包含內(nèi)部state的組件。但是,使用function的形式,失去了上面的shouldComponentUpdate,我們無法通過判斷前后狀態(tài)來決定是否更新。而且,在函數(shù)組件中,react不再區(qū)分mount和update兩個狀態(tài),這意味著函數(shù)組件的每一次調(diào)用都會執(zhí)行其內(nèi)部的所有邏輯,那么會帶來較大的性能損耗。因此useMemo 和useCallback就是解決性能問題的殺手锏。

對比

useCallback和useMemo的參數(shù)跟useEffect一致,他們之間最大的區(qū)別有是useEffect會用于處理副作用,而前兩個hooks不能。

useMemo和useCallback都會在組件第一次渲染的時候執(zhí)行,之后會在其依賴的變量發(fā)生改變時再次執(zhí)行;并且這兩個hooks都返回緩存的值,useMemo返回緩存的變量,useCallback返回緩存的函數(shù)。

useMemo

我們來看一個反例:

這里創(chuàng)建了兩個state,然后通過expensive函數(shù),執(zhí)行一次昂貴的計(jì)算,拿到count對應(yīng)的某個值。我們可以看到:無論是修改count還是val,由于組件的重新渲染,都會觸發(fā)expensive的執(zhí)行(能夠在控制臺看到,即使修改val,也會打印);

但是這里的昂貴計(jì)算只依賴于count的值,在val修改的時候,是沒有必要再次計(jì)算的。在這種情況下,我們就可以使用useMemo,只在count的值修改時,執(zhí)行expensive計(jì)算:

上面我們可以看到,使用useMemo來執(zhí)行昂貴的計(jì)算,然后將計(jì)算值返回,并且將count作為依賴值傳遞進(jìn)去。這樣,就只會在count改變的時候觸發(fā)expensive執(zhí)行,在修改val的時候,返回上一次緩存的值。

useCallback

useCallback 講完了useMemo,接下來是useCallback。useCallback跟useMemo比較類似,但它返回的是緩存的函數(shù)。我們看一下最簡單的用法:

const fnA = useCallback(fnB, [a]) 上面的useCallback會將我們傳遞給它的函數(shù)fnB返回,并且將這個結(jié)果緩存;當(dāng)依賴a變更時,會返回新的函數(shù)。既然返回的是函數(shù),我們無法很好的判斷返回的函數(shù)是否變更,所以我們可以借助ES6新增的數(shù)據(jù)類型Set來判斷,具體如下:

我們可以看到,每次修改count,set.size就會+1,這說明useCallback依賴變量count,count變更時會返回新的函數(shù);而val變更時,set.size不會變,說明返回的是緩存的舊版本函數(shù)。

知道useCallback有什么樣的特點(diǎn),那有什么作用呢?

使用場景是:有一個父組件,其中包含子組件,子組件接收一個函數(shù)作為props;通常而言,如果父組件更新了,子組件也會執(zhí)行更新;但是大多數(shù)場景下,更新是沒有必要的,我們可以借助useCallback來返回函數(shù),然后把這個函數(shù)作為props傳遞給子組件;這樣,子組件就能避免不必要的更新。

不僅是上面的例子,所有依賴本地狀態(tài)或props來創(chuàng)建函數(shù),需要使用到緩存函數(shù)的地方,都是useCallback的應(yīng)用場景。

多談一點(diǎn) useEffect、useMemo、useCallback都是自帶閉包的。也就是說,每一次組件的渲染,其都會捕獲當(dāng)前組件函數(shù)上下文中的狀態(tài)(state, props),所以每一次這三種hooks的執(zhí)行,反映的也都是當(dāng)前的狀態(tài),你無法使用它們來捕獲上一次的狀態(tài)。對于這種情況,我們應(yīng)該使用ref來訪問。

以上就是react性能優(yōu)化useMemo與useCallback使用對比詳解的詳細(xì)內(nèi)容,更多關(guān)于react性能優(yōu)化useMemo useCallback的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React.js中常用的ES6寫法總結(jié)(推薦)

    React.js中常用的ES6寫法總結(jié)(推薦)

    本篇文章中主要介紹了React.js中常用的ES6寫法總結(jié)(推薦),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Jira 任務(wù)管理系統(tǒng)項(xiàng)目總結(jié)講解

    Jira 任務(wù)管理系統(tǒng)項(xiàng)目總結(jié)講解

    這篇文章主要為大家介紹了Jira 任務(wù)管理系統(tǒng)項(xiàng)目總結(jié)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 前端必學(xué)之完美組件封裝原則(適用react、vue)

    前端必學(xué)之完美組件封裝原則(適用react、vue)

    對于當(dāng)今的前端開發(fā),模塊化已經(jīng)成了一種通用的解決方案,不管是vue還是React還是Angular,其中都會涉及的組件的封裝,這篇文章主要介紹了前端必學(xué)之完美組件封裝原則的相關(guān)資料,需要的朋友可以參考下
    2025-09-09
  • react 下拉框內(nèi)容回顯的實(shí)現(xiàn)思路

    react 下拉框內(nèi)容回顯的實(shí)現(xiàn)思路

    這篇文章主要介紹了react 下拉框內(nèi)容回顯,實(shí)現(xiàn)思路是通過將下拉框選項(xiàng)的value和label一起存儲到state中, 初始化表單數(shù)據(jù)時將faqType對應(yīng)的label查找出來并設(shè)置到Form.Item中,最后修改useEffect,需要的朋友可以參考下
    2024-05-05
  • React中的useState和useEffect詳細(xì)解析

    React中的useState和useEffect詳細(xì)解析

    useState和useEffect是React的兩個重要Hook,用于組件狀態(tài)管理和處理副作用,useState允許添加狀態(tài)變量,控制組件渲染,而useEffect用于執(zhí)行渲染后的副作用操作,本文給大家介紹React中的useState和useEffect詳細(xì)解析,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • react-native-video實(shí)現(xiàn)視頻全屏播放的方法

    react-native-video實(shí)現(xiàn)視頻全屏播放的方法

    這篇文章主要介紹了react-native-video實(shí)現(xiàn)視頻全屏播放的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • 淺談React19事件調(diào)度的設(shè)計(jì)思路

    淺談React19事件調(diào)度的設(shè)計(jì)思路

    本文主要介紹了React選擇MessageChannel作為事件調(diào)度機(jī)制的原因,essageChannel屬于宏任務(wù),延遲極低且不會阻塞渲染,能夠滿足React在不阻塞瀏覽器的前提下,盡可能多地推進(jìn)Fiber渲染進(jìn)度的需求
    2026-05-05
  • 手把手教您實(shí)現(xiàn)react異步加載高階組件

    手把手教您實(shí)現(xiàn)react異步加載高階組件

    這篇文章主要介紹了手把手教您實(shí)現(xiàn)react異步加載高階組件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • React-hooks中的useEffect使用步驟

    React-hooks中的useEffect使用步驟

    這篇文章主要介紹了React-hooks中的useEffect,對于React組件來說,主作用是根據(jù)數(shù)據(jù)(state/props)渲染UI,除此之外都是副作用(比如手動修改DOM、發(fā)送ajax請求),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-05-05
  • 使用react-native-doc-viewer實(shí)現(xiàn)文檔預(yù)覽

    使用react-native-doc-viewer實(shí)現(xiàn)文檔預(yù)覽

    這篇文章主要介紹了使用react-native-doc-viewer實(shí)現(xiàn)文檔預(yù)覽,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評論

布拖县| 临桂县| 松江区| 垣曲县| 夏河县| 广东省| 平果县| 阿城市| 吴堡县| 齐河县| 会昌县| 乳源| 清涧县| 建湖县| 贵南县| 昆山市| 遵义县| 基隆市| 平谷区| 金昌市| 梁河县| 红河县| 南投市| 罗田县| 遵义市| 海门市| 措勤县| 习水县| 孝义市| 扎赉特旗| 萨迦县| 龙南县| 乐陵市| 延川县| 大洼县| 河南省| 嵊泗县| 潮州市| 晋江市| 伊吾县| 平江县|