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

React中useMemo 和 useCallback 的區(qū)別小結

 更新時間:2026年06月10日 09:33:57   作者:goDeep  
本文主要介紹了ReactHooks中的useMemo和useCallback的區(qū)別與應用場景,useMemo用于緩存計算結果,useCallback用于緩存函數(shù)引用,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧

前言

剛開始學習 React Hooks 時,我一直分不清 useMemo 和 useCallback。

因為它們長得非常像:

const value = useMemo(() => {
  return result
}, [])

const fn = useCallback(() => {
  console.log("hello")
}, [])

甚至依賴數(shù)組的寫法都一樣。

學習了一段時間后,我發(fā)現(xiàn):

useMemo 緩存的是“值”,useCallback 緩存的是“函數(shù)”。

這是兩者最核心的區(qū)別。

什么是 useMemo

useMemo 用于緩存計算結果。

語法:

const memoizedValue = useMemo(() => {
  return compute()
}, [deps])

例如:

const total = useMemo(() => {
  console.log("執(zhí)行計算")

  return price * count
}, [price, count])

當:

price
count

沒有變化時,

React 不會再次執(zhí)行計算邏輯。

直接返回上一次緩存結果。

useMemo 解決什么問題

假設有一個商品列表:

const products = [...]

需要篩選:

const filteredProducts = products.filter(...)

如果組件頻繁重新渲染:

setInputValue(...)

即使商品數(shù)據(jù)沒變化,

filter 也會不斷執(zhí)行。

這時可以使用:

const filteredProducts = useMemo(() => {
  return products.filter(...)
}, [products])

避免重復計算。

什么是 useCallback

useCallback 用于緩存函數(shù)。

語法:

const memoizedFn = useCallback(() => {
  ...
}, [deps])

例如:

const handleClick = useCallback(() => {
  console.log("點擊")
}, [])

依賴不變時,

返回同一個函數(shù)引用。

useCallback 解決什么問題

React 每次渲染時:

function App() {
  const handleClick = () => {}

  return <Child onClick={handleClick} />
}

實際上:

handleClick

會被重新創(chuàng)建。

即:

舊函數(shù) !== 新函數(shù)

如果:

Child

使用了:

React.memo

那么仍然會重新渲染。

因為:

props變化了

此時可以使用:

const handleClick = useCallback(() => {}, [])

讓函數(shù)引用保持不變。

最簡單的記憶方法

記住一句話:

useMemo 緩存結果

useCallback 緩存函數(shù)

例如:

const total = useMemo(() => {
  return price * count
}, [price, count])

緩存的是:

100
200
300

這些計算結果。

const handleClick = useCallback(() => {
  console.log("hello")
}, [])

緩存的是:

function

本身。

Vue 開發(fā)者如何理解

如果你是 Vue 開發(fā)者。

可以這樣記:

useMemo

類似:

computed
const total = computed(() => {
  return price.value * count.value
})

緩存計算結果。

useCallback

Vue 中沒有完全對應概念。

因為 Vue 模板編譯階段已經做了很多優(yōu)化。

React 更關注:

函數(shù)引用是否變化

所以才有 useCallback。

useMemo 和 useCallback 對比

對比項useMemouseCallback
緩存內容函數(shù)
返回值計算結果函數(shù)
常見場景大數(shù)據(jù)計算傳遞事件函數(shù)
對應Vuecomputed無明顯對應

一個常見誤區(qū)

很多初學者會這樣寫:

const handleClick = useCallback(() => {
  console.log("hello")
}, [])

整個項目到處都是:

useCallback

實際上:

這樣并不一定提升性能。

因為:

useCallback 本身也有維護成本。

React 需要:

  • 保存緩存
  • 對比依賴

如果函數(shù)很簡單:

() => console.log("hello")

完全沒必要使用。

什么時候應該使用

推薦使用場景:

useMemo

  • 大量數(shù)據(jù)計算
  • 排序
  • 過濾
  • 聚合統(tǒng)計

例如:

1000+
10000+

條數(shù)據(jù)處理。

useCallback

  • 傳遞給子組件
  • React.memo 配合使用
  • 自定義 Hook 返回函數(shù)

例如:

<Child onClick={handleClick} />

面試回答模板

如果面試官問:

“useMemo 和 useCallback 的區(qū)別是什么?”

我會這樣回答:

useMemo 用于緩存計算結果,返回的是一個值;useCallback 用于緩存函數(shù),返回的是一個函數(shù)引用。兩者都依賴依賴數(shù)組控制是否重新生成。通常 useMemo 用于優(yōu)化復雜計算,useCallback 用于避免函數(shù)重復創(chuàng)建,尤其是在 React.memo 場景下減少子組件不必要渲染。

總結

一句話記憶:

useMemo:

緩存計算結果。

useCallback:

緩存函數(shù)引用。

不要為了優(yōu)化而優(yōu)化,只有在組件存在實際性能問題時,再合理使用它們。

到此這篇關于React中useMemo 和 useCallback 的區(qū)別小結的文章就介紹到這了,更多相關React useMemo 和 useCallback區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言使用釘釘機器人推送消息的實現(xiàn)示例

    Go語言使用釘釘機器人推送消息的實現(xiàn)示例

    本文主要介紹了Go語言使用釘釘機器人推送消息的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Go語言輕量級線程Goroutine用法實例

    Go語言輕量級線程Goroutine用法實例

    這篇文章主要介紹了Go語言輕量級線程Goroutine用法,實例分析了goroutine使用技巧,需要的朋友可以參考下
    2015-02-02
  • 詳解Go語言如何解決map并發(fā)安全問題

    詳解Go語言如何解決map并發(fā)安全問題

    常說go語言是一門并發(fā)友好的語言,對于并發(fā)操作總會在編譯期完成安全檢查,所以這篇文章我們就來聊聊go語言是如何解決map這個數(shù)據(jù)結構的線程安全問題吧
    2024-04-04
  • Go語言中的變量聲明和賦值

    Go語言中的變量聲明和賦值

    這篇文章主要介紹了Go語言中的變量聲明和賦值的方法,十分的細致全面,有需要的小伙伴可以參考下。
    2015-04-04
  • Go 實現(xiàn)基于Token 的登錄流程深度分析

    Go 實現(xiàn)基于Token 的登錄流程深度分析

    Token 認證機制的核心思想是,服務端在用戶登錄時生成一個 Token,客戶端在后續(xù)的請求中攜帶這個 Token,服務端通過驗證 Token 的有效性來確認用戶的身份,本文將帶你深入探索基于 Token 的登錄流程,這是一種更為靈活且適用于現(xiàn)代應用架構的認證方式
    2024-03-03
  • go mayfly開源項目代碼結構設計

    go mayfly開源項目代碼結構設計

    這篇文章主要為大家介紹了go mayfly開源項目代碼結構設計詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • go語言net包rpc遠程調用的使用示例

    go語言net包rpc遠程調用的使用示例

    本篇文章主要介紹了go語言net包rpc遠程調用的使用示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Go語言Cookie用法分析

    Go語言Cookie用法分析

    這篇文章主要介紹了Go語言Cookie用法,結合實例形式分析了Go語言Cookie的設置、讀取等相關操作技巧,需要的朋友可以參考下
    2017-02-02
  • 淺析在Go語言中如何實現(xiàn)協(xié)程池

    淺析在Go語言中如何實現(xiàn)協(xié)程池

    gammazero/workerpool?就是用來實現(xiàn)協(xié)程池的?Go?包,本文我們將一起來學習一下其使用方法,并深入其源碼來探究下如何實現(xiàn)一個?Go?協(xié)程池,需要的可以了解下
    2025-06-06
  • 使用Go語言實現(xiàn)谷歌翻譯功能

    使用Go語言實現(xiàn)谷歌翻譯功能

    這篇文章主要為大家詳細介紹了如何使用Go語言實現(xiàn)谷歌翻譯功能,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考下
    2024-02-02

最新評論

和田市| 麟游县| 金沙县| 新竹县| 夏邑县| 卫辉市| 翁源县| 余干县| 渝中区| 麻栗坡县| 长治县| 南宁市| 南宁市| 安康市| 望城县| 阿拉善盟| 资源县| 克什克腾旗| 周至县| 卫辉市| 六安市| 县级市| 县级市| 云龙县| 新化县| 醴陵市| 安康市| 寿宁县| 宁陕县| 罗山县| 应用必备| 紫云| 拜泉县| 阳谷县| 大同市| 绥江县| 枣阳市| 开远市| 榆中县| 凌海市| 论坛|