useMemo和useCallback到底有什么区别

不知道大家在工作中有没有用到 useMemouseCallback 这两个钩子,笔者总是忘记这两者的区别,现在写一篇记录彻底搞懂这两个 Hook 的区别。

useMemouseCallback 它们都用于优化性能,它们主要是用途有所不同。

useMemo

useMemo 用于记忆一个计算值。当你有一个性能消耗比较大的计算操作,并且你不希望在每次组件渲染时都重新计算它时,你可以使用 useMemo。这个钩子只有在其依赖项发生变化时才会重新计算记忆值。

jsx 复制代码
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

在这个例子中,computeExpensiveValue 只有在 ab 改变时才会重新执行。如果不用useMemo 钩子,就会每次在组件渲染时计算。造成性能浪费。

useCallback

useCallback 用于记忆一个函数实例。主要应用于将函数作为 props 传递给子组件的场景,特别是当这些子组件使用了 React.memoshouldComponentUpdate 时。如果你不使用 useCallback,那么每次父组件渲染时都会创建一个新的函数实例,即使这个函数的实际代码并没有改变。此时,就会导致子组件也会重新渲染。

jsx 复制代码
const memoizedCallback = useCallback(() => {
  doSomething(a, b);
}, [a, b]);

在这个例子中,只有当 ab 改变时,函数 doSomething 的实例才会改变。

主要区别

  • 用途useMemo 用于缓存计算结果,useCallback 用于缓存函数实例。
  • 返回值useMemo 返回的是函数执行的结果,useCallback 返回的是函数本身。
  • 使用场景
    • 使用 useMemo 当你需要避免在每次渲染时都进行昂贵的计算。
    • 使用 useCallback 当你需要将相同的回调函数传递给优化过的子组件,以避免不必要的渲染。

在实际应用中,应该避免过度使用这些钩子,因为不恰当的使用可能会导致性能问题,而不是优化。例如,过度使用 useMemouseCallback 可能会导致内存占用增加,因为记忆的值和函数实例需要被存储在内存中。

相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95271 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大1 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师1 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学1 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端