在学习 React 时,很多人初步接触 useCallback 都有一个同样的疑问:

“useCallback 到底是干啥的?不是简单地就是‘缓存一个函数’吗?我一直不明白它真正有什么用。”

这篇文章就来给你一个全方位、实操、有例实的 useCallback 入门指南,帮你真正理解它的作用。


1. useCallback 是什么?

它是 React 的一个 Hook,用来 缓存一个函数的引用,避免在组件重新渲染时重新创建该函数

基本用法:

const memoizedCallback = useCallback(() => {// ...
}, [deps]);

当 deps 不变化时,这个函数就不会重新创建。


2. 为什么需要 useCallback?

React 组件每次重新渲染,所有的函数都是重新创建的。如果这个函数传给了子组件,那子组件就会被认为改变了 props,不论其内部是否真正改变。

如果子组件是 React.memo() 缓存的,那么这个 props 函数的变化就会打破缓存,导致子组件重新渲染。

useCallback 的作用,就是保证函数引用 在 deps 不变化时不变,从而避免子组件无效重渲染。


3. 简单示例

const Child = React.memo(({ onClick }: { onClick: () => void }) => {console.log('Child 渲染了');return <button onClick={onClick}>子按钮</button>;
});function Parent() {const [count, setCount] = useState(0);const handleClick = useCallback(() => {console.log('Child 被点击');}, []);return (<div><button onClick={() => setCount(c => c + 1)}>增加计数</button><Child onClick={handleClick} /></div>);
}

每次点击“增加计数”按钮,如果你用了 useCallbackChild 就不会重渲染。


4. TypeScript 下不加参数类型会有问题?

是的,当 TypeScript 打开 strict mode 时,如果 useCallback 的函数有参数却没有指定类型,就会报错。

const handleClick = useCallback((e) => {console.log(e.target);
}, []); // 报错:参数 'e' 类型不明

正确写法:

const handleClick = useCallback((e: React.MouseEvent<HTMLButtonElement>) => {console.log(e.target);
}, []);

为什么会报错?因为 TypeScript 对不包含参数类型的函数无法精确推断类型,尤其是返回值是 void 时更是如此。


5. 什么时候需要用 useCallback?

适合场景:

  • 函数被传给子组件

  • 子组件用了 React.memo()

  • 子组件性能故事明显

不需要的场景:

  • 函数只在本地使用

  • 没有性能问题,例如组件很小或非常简单


6. 小结

useCallback 不是所有场景都需要用,但在需要性能优化时,它是非常有用的工具。它和 React.memo 结合,就像 React 性能优化的黄金伴侣,用好了可以效果显著;用错了反而可能使性能下降。

最好的做法是:需时之用,而不是一上来就翘翘地拿一堆 useCallback

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/909130.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909130.shtml
英文地址,请注明出处:http://en.pswp.cn/news/909130.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14.计算机网络End

计算机网络end 一、概念 网络协议三要素&#xff1a;语法、语义、同步TCP/IP中为运输层提供服务的层级&#xff1a;网际层计算机网络性能指标&#xff08;答5个即可&#xff09;&#xff1a; 带宽时延吞吐量往返时间&#xff08;RTT&#xff09;利用率 交换式以太网用户带宽&…

Next.js + Supabase = 快速开发 = 高速公路

Next.js Supabase介绍一下这2个好的&#xff0c;直说重点&#xff1a; ✅ Next.js&#xff1a;React 的“终极形态” 一句话概括&#xff1a; Next.js 是基于 React 的 Web 框架&#xff0c;帮你快速构建全栈应用&#xff0c;支持 SSR&#xff08;服务端渲染&#xff09;、AP…

机器学习用于算法交易(Matlab实现)

机器学习用于算法交易&#xff08;Matlab实现&#xff09; 摘要 随着金融市场的复杂性和交易量的不断增长&#xff0c;传统交易方式逐渐暴露出局限性&#xff0c;算法交易因其高效性和精准性已成为主流趋势。在此背景下&#xff0c;将机器学习融入算法交易具有重要的研究意义…

day64—回溯—组合数(LeetCode-77)

题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2&#xff1a; 输入&#xff1a…

机器学习与深度学习21-信息论

目录 前文回顾1.信息上的概念2.相对熵是什么3.互信息是什么4.条件熵和条件互信息5.最大熵模型6.信息增益与基尼不纯度 前文回顾 上一篇文章链接&#xff1a;地址 1.信息上的概念 信息熵&#xff08;Entropy&#xff09;是信息理论中用于度量随机变量不确定性的概念。它表示了…

chrome138版本及以上el-input的textarea输入问题

描述 项目基于vue2 element UI 问题简述&#xff1a;Chrome138及以上版本&#xff0c;把组件中的el-input的textarea的disabled属性从true设为false&#xff0c;无法输入 封装了一套表单输入组件&#xff0c;其中的textarea如下&#xff1a; <div v-if"item.type te…

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…

TASTE-Rob:推进面向任务的手-目标交互视频生成,实现可通用的机器人操作

25年3月来自香港中文大学的论文“TASTE-Rob: Advancing Video Generation of Task-Oriented Hand-Object Interaction for Generalizable Robotic Manipulation”。 本文也是在解决现有数据集和模型在面向任务的手部-目标交互视频生成方面的关键限制&#xff0c;这是为机器人模…

Trae AI IDE 全网最全的使用教程

Trae AI IDE 全网最全的使用教程 近期&#xff0c;字节发布了一款 AI Coding 产品 —— Trae&#xff0c;它是一款对标 Cursor 和 Windsurf 的全新 IDE&#xff0c;也是一款真正为中文开发者量身定制的工具&#xff0c;可谓是中文开发者的福音。 其优雅的 UI、丝滑的交互、母语…

GraspCorrect:通过视觉-语言模型引导反馈进行机器人抓握矫正

25年3月来自韩国 POSTECH 的论文 “GraspCorrect: Robotic Grasp Correction via Vision-Language Model-Guided Feedback”。 尽管机器人操作技术取得了显著进步&#xff0c;但实现一致且稳定的抓取仍然是一项根本挑战&#xff0c;常常限制复杂任务的成功执行。分析表明&…

浏览器兼容-polyfill-本地服务-优化

babel和webpack结合 npx babel src --out-dir dist --presetsbabel/preset-env 这是把src下面的东西都用babel转化一下 webpack可以和babel结合使用&#xff0c;首先下载一个这东西&#xff1a; npm install babel-loader -D webpack配置&#xff1a; const path requir…

组织结构图软件:数据驱动的可视化架构管理工具

1. 组织结构图软件概述 组织结构图概念 组织结构图是一种图形化工具&#xff0c;用于展示组织内部的层级关系、部门职能和人员分工。它通过清晰的线条和文本框连接&#xff0c;直观呈现企业或机构的架构&#xff0c;帮助管理者和员工快速理解组织的运作模式。 重要性 在企业…

大数据学习(138)-Hive数据分析3

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…

深度学习环境搭建(pycharm+yolov5)

B站 &#xff1a;道传科技上位机 观看教程 一、pycharm的安装 pycharm windows版本下载地址&#xff1a;Download PyCharm: The Python IDE for data science and web development by JetBrains 下载社区版本&#xff08;日常学习使用够用了&#xff09;&#xff0c;专业版…

K8S中应用无法获取用户真实ip问题排查

现象 领导反馈生产环境的用户ip有问题。登陆到这个页面&#xff0c;发现是所有的用户ip都是172.30.94.97&#xff0c;这是个内部网络ip. 排查过程 1 登陆到应用前端nginx&#xff0c; 查看nginx的请求日志 172.30.94.97 - - [17/Jul/2024:02:02:54 0000] "POST /***/n…

2.倒排索引

传统数据库mysql使用的是正向索引 词条是不允许重复的&#xff0c;给词条创建唯一索引&#xff0c;根据词条查找的速度就很快了。

【Android Studio】新建项目及问题解决

新建项目 按照《Android 第一行代码》中 1.3 小节的步骤创建项目。 注意&#xff1a;Minimum API Level 用于设置项目的最低兼容版本。Android 5.0 以上的系统已经占据超过了 99.9% 的 Android 市场份额&#xff0c;因此这里指定为 API 21: Android 5.0 即可。 问题解决 &…

SX1268低功耗sub-1g芯片支持lora和GFSK调制

SX1268 射频收发器是长距离无线应用的理想设备&#xff0c;支持410-810MHZ。它专为长电池寿命而设计&#xff0c;仅消耗4.2 mA的主动接收电流。SX1268 可以使用高效的集成功率放大器在490 MHz传输高达 22 dBm 的信号。在 780 MHZ时&#xff0c;SX1268 在天线端口传输10dBm的信号…

C#高级:利用反射让字符串决定调用哪个方法

一、反射的实现 using System; using System.Reflection; using System.Threading.Tasks;public class Calculator {public int Add(int a, int b){return a b;}public int Subtract(int a, int b){return a - b;}public int Multiply(int a, int b){return a * b;}public do…

图像二分类任务推荐使用Sigmoid函数‌

‌图像二分类任务中可以使用Softmax作为激活函数&#xff0c;但通常更推荐使用Sigmoid函数‌。Softmax函数可以将多个类别的输出转换成概率分布&#xff0c;适合多分类任务。在二分类任务中&#xff0c;虽然可以使用Softmax&#xff0c;但它会生成两个输出值&#xff08;每个类…