当前位置: 首页 > news >正文

useCallback和useMemo的区别?

文章目录

  • 前言
  • useCallback
  • useMemo
  • useCallback除了缓存回调函数还可以做什么操作?
  • 后言

前言

hello world欢迎来到前端的新世界


😜当前文章系列专栏:react.js
🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家指出)🌹
💖感谢大家支持!您的观看就是作者创作的动力

useCallback和useMemo都是React提供的用于性能优化的Hook,但它们的作用和应用场景有所不同。

useCallback

useCallback的作用是缓存函数,避免在每次渲染时都创建新的函数。当需要将一个回调函数作为props传递给子组件时,使用useCallback可以避免因为父组件的重新渲染而导致子组件的重复渲染。useCallback接收一个函数和一个依赖项数组作为参数。当依赖项数组发生变化时,会重新创建函数。如果依赖项数组为空,那么只会在组件挂载时创建一次函数。

应用场景

  • 在父组件中定义回调函数,作为props传递给子组件时,避免子组件重复渲染。
  • 在某个函数内部,定义了一个会被多次调用的回调函数,通过useCallback将其缓存,避免过度渲染。

useMemo

useMemo的作用是缓存计算结果,避免重复计算。当需要根据一些数据进行复杂的计算,或者从一个较大的数据集中过滤出一些数据时,可以使用useMemo来缓存计算结果,避免重复计算。useMemo接受两个参数:一个计算函数和一个依赖项数组。只有当依赖项数组发生变化时,才会重新计算。

应用场景

  • 对于一些昂贵的计算,如大量字符串拼接、复杂的数据处理、使用昂贵的库等,可以使用useMemo将计算结果缓存。
  • 对于某些数据的过滤、排序等操作,可以使用useMemo缓存计算结果,避免重复计算。

useCallback除了缓存回调函数还可以做什么操作?

除了缓存回调函数,useCallback本质上没有其他功能。它的主要作用是避免因为函数引用的变化而触发子组件的不必要重渲染,从而优化组件的性能。

但是在实际应用中,我们可以结合其他Hook和技巧,将useCallback与其他操作结合使用,以达到更好的效果,例如:

  • 结合useEffect:在某些情况下,我们需要在回调函数执行之后执行一些副作用操作,例如更新某个状态、发送网络请求等。这时,我们可以在useEffect中传入回调函数和依赖项,当依赖项发生变化时,执行回调函数并进行副作用操作。

  • 结合useRef:如果我们需要在多个地方使用同一个回调函数,但又不想通过props的方式来传递该函数,可以使用useRef来存储该函数,并在需要时调用。

  • 结合useMemo:在某些情况下,我们需要在回调函数中进行一些计算,但又不想在每次渲染时重新计算。这时我们可以使用useMemo缓存计算结果,并将其与回调函数结合使用。

总之,useCallback是一个非常有用的Hook,可以帮助我们优化组件的性能。它虽然本质上只是缓存回调函数,但是结合其他Hook和技巧,可以发挥出更多的作用。

后言

创作不易,要是本文章对广大读者有那么一点点帮助 不妨三连支持一下,您的鼓励就是博主创作的动力

http://www.lryc.cn/news/215237.html

相关文章:

  • Angular组件生命周期详解
  • Redsync 多 Redis 实例使用 demo
  • Docker(1)——安装Docker以及配置阿里云镜像加速
  • MCU HardFault_Handler调试方法
  • 【深度学习】AUTOMATIC1111 / stable-diffusion-webui docker
  • [Hive] 查询结果保存
  • Es中出现unassigned shards问题解决
  • RT-DERT:在实时目标检测上,DETRs打败了yolo
  • uniapp/H5富文本复制文本功能
  • 通付盾Web3专题 | 智能账户:数字时代基础单元
  • java网上阅读网站系统eclipse定制开发mysql数据库BS模式java编程jdbc
  • 人工智能基础_机器学习007_高斯分布_概率计算_最小二乘法推导_得出损失函数---人工智能工作笔记0047
  • 开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化
  • 安卓手机数据恢复工具 DiskDigger Pro 中文版-适用于已获得 root 权限的设备!可以从您的存储卡或内存恢复数据
  • Python 生成Android不同尺寸的图标
  • PHP使用GuzzleHttp进行HTTP请求
  • pytorch笔记:allclose,isclose,eq,equal
  • YoloV8修改检测框为中心点
  • 文言一心中将C语言归类为低级语言,这对么?
  • [补题记录] Codeforces Round 906 (Div. 2)(A~D)
  • Kubernetes yaml文件
  • Linux——切换CUDA版本
  • 利用云计算和微服务架构开发可扩展的同城外卖APP
  • 数据结构详细笔记——二叉树
  • react实现列表增删改查的小demo(class组件版)
  • 运行批处理文件,Windows 10至少提供了三种方法,有的可以设置定时运行
  • C++ detach线程的归属权和控制权交给runtime library的原因
  • Android应用集成RabbitMQ消息处理指南
  • 爆改86㎡户型,中式禅意,自然诗意!福州中宅装饰,福州装修
  • LVGL库入门 02 - 布局