React中useMemo 和 useCallback 的区别小结

 更新时间:2026年06月10日 09:33:57   作者:goDeep  
本文主要介绍了ReactHooks中的useMemo和useCallback的区别与应用场景,useMemo用于缓存计算结果,useCallback用于缓存函数引用,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

前言

刚开始学习 React Hooks 时,我一直分不清 useMemo 和 useCallback。

因为它们长得非常像:

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

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

甚至依赖数组的写法都一样。

学习了一段时间后,我发现:

useMemo 缓存的是“值”,useCallback 缓存的是“函数”。

这是两者最核心的区别。

什么是 useMemo

useMemo 用于缓存计算结果。

语法:

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

例如:

const total = useMemo(() => {
  console.log("执行计算")

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

当:

price
count

没有变化时,

React 不会再次执行计算逻辑。

直接返回上一次缓存结果。

useMemo 解决什么问题

假设有一个商品列表:

const products = [...]

需要筛选:

const filteredProducts = products.filter(...)

如果组件频繁重新渲染:

setInputValue(...)

即使商品数据没变化,

filter 也会不断执行。

这时可以使用:

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

避免重复计算。

什么是 useCallback

useCallback 用于缓存函数。

语法:

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

例如:

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

依赖不变时,

返回同一个函数引用。

useCallback 解决什么问题

React 每次渲染时:

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

  return <Child onClick={handleClick} />
}

实际上:

handleClick

会被重新创建。

即:

旧函数 !== 新函数

如果:

Child

使用了:

React.memo

那么仍然会重新渲染。

因为:

props变化了

此时可以使用:

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

让函数引用保持不变。

最简单的记忆方法

记住一句话:

useMemo 缓存结果

useCallback 缓存函数

例如:

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

缓存的是:

100
200
300

这些计算结果。

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

缓存的是:

function

本身。

Vue 开发者如何理解

如果你是 Vue 开发者。

可以这样记:

useMemo

类似:

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

缓存计算结果。

useCallback

Vue 中没有完全对应概念。

因为 Vue 模板编译阶段已经做了很多优化。

React 更关注:

函数引用是否变化

所以才有 useCallback。

useMemo 和 useCallback 对比

对比项useMemouseCallback
缓存内容函数
返回值计算结果函数
常见场景大数据计算传递事件函数
对应Vuecomputed无明显对应

一个常见误区

很多初学者会这样写:

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

整个项目到处都是:

useCallback

实际上:

这样并不一定提升性能。

因为:

useCallback 本身也有维护成本。

React 需要:

  • 保存缓存
  • 对比依赖

如果函数很简单:

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

完全没必要使用。

什么时候应该使用

推荐使用场景:

useMemo

  • 大量数据计算
  • 排序
  • 过滤
  • 聚合统计

例如:

1000+
10000+

条数据处理。

useCallback

  • 传递给子组件
  • React.memo 配合使用
  • 自定义 Hook 返回函数

例如:

<Child onClick={handleClick} />

面试回答模板

如果面试官问:

“useMemo 和 useCallback 的区别是什么?”

我会这样回答:

useMemo 用于缓存计算结果,返回的是一个值;useCallback 用于缓存函数,返回的是一个函数引用。两者都依赖依赖数组控制是否重新生成。通常 useMemo 用于优化复杂计算,useCallback 用于避免函数重复创建,尤其是在 React.memo 场景下减少子组件不必要渲染。

总结

一句话记忆:

useMemo:

缓存计算结果。

useCallback:

缓存函数引用。

不要为了优化而优化,只有在组件存在实际性能问题时,再合理使用它们。

到此这篇关于React中useMemo 和 useCallback 的区别小结的文章就介绍到这了,更多相关React useMemo 和 useCallback区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言使用钉钉机器人推送消息的实现示例

    Go语言使用钉钉机器人推送消息的实现示例

    本文主要介绍了Go语言使用钉钉机器人推送消息的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Go语言轻量级线程Goroutine用法实例

    Go语言轻量级线程Goroutine用法实例

    这篇文章主要介绍了Go语言轻量级线程Goroutine用法,实例分析了goroutine使用技巧,需要的朋友可以参考下
    2015-02-02
  • 详解Go语言如何解决map并发安全问题

    详解Go语言如何解决map并发安全问题

    常说go语言是一门并发友好的语言,对于并发操作总会在编译期完成安全检查,所以这篇文章我们就来聊聊go语言是如何解决map这个数据结构的线程安全问题吧
    2024-04-04
  • Go语言中的变量声明和赋值

    Go语言中的变量声明和赋值

    这篇文章主要介绍了Go语言中的变量声明和赋值的方法,十分的细致全面,有需要的小伙伴可以参考下。
    2015-04-04
  • Go 实现基于Token 的登录流程深度分析

    Go 实现基于Token 的登录流程深度分析

    Token 认证机制的核心思想是,服务端在用户登录时生成一个 Token,客户端在后续的请求中携带这个 Token,服务端通过验证 Token 的有效性来确认用户的身份,本文将带你深入探索基于 Token 的登录流程,这是一种更为灵活且适用于现代应用架构的认证方式
    2024-03-03
  • go mayfly开源项目代码结构设计

    go mayfly开源项目代码结构设计

    这篇文章主要为大家介绍了go mayfly开源项目代码结构设计详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • go语言net包rpc远程调用的使用示例

    go语言net包rpc远程调用的使用示例

    本篇文章主要介绍了go语言net包rpc远程调用的使用示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Go语言Cookie用法分析

    Go语言Cookie用法分析

    这篇文章主要介绍了Go语言Cookie用法,结合实例形式分析了Go语言Cookie的设置、读取等相关操作技巧,需要的朋友可以参考下
    2017-02-02
  • 浅析在Go语言中如何实现协程池

    浅析在Go语言中如何实现协程池

    gammazero/workerpool 就是用来实现协程池的 Go 包,本文我们将一起来学习一下其使用方法,并深入其源码来探究下如何实现一个 Go 协程池,需要的可以了解下
    2025-06-06
  • 使用Go语言实现谷歌翻译功能

    使用Go语言实现谷歌翻译功能

    这篇文章主要为大家详细介绍了如何使用Go语言实现谷歌翻译功能,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考下
    2024-02-02

最新评论