React 播客专栏 Vol.16|useRef 和 useMemo 是干嘛的?

👋 欢迎回到《前端达人 · React 播客书单》第 16 期(正文内容为学习笔记摘要,音频内容是详细的解读,方便你理解),请点击下方收听


视频版


🎙 欢迎来到《前端达人 · 播客书单》第 16 期。

今天我们来聊聊两个非常实用但经常被误解的 React Hook:useRef 和 useMemo

你可能在项目里“见过但没用过”,或者“不太确定场景”,这节课我们用简单示例和对比讲清楚:

  • 它们分别在做什么?

  • 什么时候该用它们?

  • 它们和 useState 有啥不同?

✅ Hook 是什么来头?

自 React 16.8 起,Hook 正式成为函数组件的第一公民,赋予它们类似类组件的能力:状态、生命周期、副作用……

Hook 的使用有两个前提记住:

🚫 不能写在 if / for / 内层函数中 

✅ 只能写在函数组件的“顶层作用域”

🔍 useRef 是什么?(1/3)

useRef 是用来存储“不会引起渲染”的可变值容器

const countRef = useRef(0);console.log(countRef.current); // 访问值
countRef.current = 100; // 修改值,不会触发组件更新

🧠 小知识点:

  • 跟 useState 不一样,它不会触发渲染

  • .current 才是真正存放的值

  • 适合存储:定时器 ID、上一次的 prop、一些中间状态

💡 useRef 最典型用法:操作 DOM(2/3)

你可能已经遇到这个场景:

页面加载后自动聚焦一个 input 输入框,怎么办?

👀 用 useRef + useEffect 就搞定:

function MyComponent() {const inputRef = useRef<HTMLInputElement>(null);useEffect(() => {inputRef.current?.focus(); // 聚焦 input}, []);return <input ref={inputRef} />;
}

除此之外,还可以保存:

  • 防抖 / 节流计时器

  • 页面滚动位置

  • WebSocket 实例对象

🧱 TypeScript 下的 useRef(3/3)

在 TS 中使用 useRef 时,强烈推荐加类型标注

const inputRef = useRef<HTMLInputElement>(null);
const buttonRef = useRef<HTMLButtonElement>(null);

📌 如果初始值非 null,比如数字:

const countRef = useRef(0); // 自动推断为 number 类型

🎁 实用小表:

DOM 元素类型

对应 TS 类型

input

HTMLInputElement

button

HTMLButtonElement

div

HTMLDivElement

🧮 useMemo 是什么?(1/2)

useMemo 用来做一件事:缓存复杂计算的结果

const memoizedValue = useMemo(() => {return expensiveCalculation(a, b);
}, [a, b]);

⚙️ 它接受两个参数:

1️⃣ 一个返回值的函数 2️⃣ 一个依赖项数组(变化才会重新执行函数)

📌 如果依赖项不变,它就会“拿缓存值”,而不是重新计算。

⚠️ useMemo 的优点和坑点(2/2)

✅ 优点:

  • 减少复杂计算的频率

  • 和 React.memo 配合,减少子组件重渲染

⚠️ 使用注意:

不要滥用 useMemo 的几种情况

简单的计算,没必要缓存

每次都变化的依赖项,等于没缓存

想“预优化”而不是“真实遇到性能问题”

📌 小贴士:先量化,再优化。性能瓶颈是真实的,才需要 useMemo。

🧩 useRef vs useMemo 到底有啥不同?

来个表格对比最直观👇

特性

useRef

useMemo

功能

存储值 / 获取 DOM 引用

缓存复杂计算结果

是否触发渲染

❌ 不会触发

❌ 自身不触发,仅在依赖变动时重新计算

常见用途

input 聚焦、定时器 ID、外部状态

大数组计算、过滤、排序等性能敏感操作

🧪 推荐实战练习

👨‍💻 练习 1:

用 useRef 实现一个自动聚焦的登录框

👨‍💻 练习 2:

用 useMemo 模拟一个耗时计算(比如 10000 项数据过滤)

🔍 bonus:

用 Chrome DevTools 看组件是否重新渲染,对比 useMemo 使用前后性能差异

如果你喜欢这种讲解风格,欢迎关注《前端达人 · React播客书单》,我们一起用 40 天搞懂 React + TypeScript 的核心能力 💪

#React   #React播客   #前端播客   #前端达人   #TypeScript   

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

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

相关文章

漫谈英伟达GPU架构进化史:从Celsius到Blackwell

在英伟达官网,我们可以清晰地看到其从1999年Celsius到2024年Blackwell的20+代架构演进。这一历程犹如一部波澜壮阔的科技史诗,见证了英伟达在GPU领域的卓越创新与持续引领。 NVIDIA GPU架构变迁路线: 年份 NV GPU架构变迁 2025 Blackwell 2.0 2024 Blackwell 2023-2024 Hopp…

车载通信网络 --- CAN FD与CAN XL

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

DM达梦数据库开启SQL日志记录功能

DM达梦数据库开启SQL日志记录功能 配置SQL日志&#xff08;非必须的配置步骤&#xff0c;与主备集群配置无关&#xff0c;如果没有需求可以跳过配置SQL日志&#xff09; sqllog.ini 配置文件用于SQL日志的配置&#xff0c;当且仅当 INI&#xff08;dm.ini&#xff09; 参数 SV…

【HW系列】—C2远控服务器(webshell链接工具, metasploit、cobaltstrike)的漏洞特征流量特征

文章目录 蚁剑、冰蝎、哥斯拉一、蚁剑&#xff08;AntSword&#xff09;流量特征二、冰蝎&#xff08;Behinder&#xff09;流量特征三、哥斯拉&#xff08;Godzilla&#xff09;流量特征 metasploit、cobaltstrike一、Metasploit流量特征二、CobaltStrike流量特征三、检测与防…

手机平板等设备租赁行业MDM方案解析

目录 引言&#xff1a;MDM 在租赁行业的重要性日益凸显 用户场景&#xff1a;租赁公司面临的主要挑战 1. 设备丢失、逾期未还 2. 手动配置和恢复效率低 3. 非授权使用频繁 4. 时区设置混乱影响运维 5. 缺乏实时监管能力 EasyControl MDM&#xff1a;租赁设备的远程管控…

前端面试核心考点全解析

前端面试常见问题及解析大纲 核心技术篇 HTML相关问题 1. HTML5新特性解析 语义化标签&#xff08;<header>、<section>等&#xff09;的作用与示例本地存储&#xff08;localStorage与sessionStorage&#xff09;的差异 localStorage.setItem(key, value); c…

Selenium 测试框架 - Kotlin

🚀Selenium Kotlin 实践指南:以百度搜索为例的完整测试示例 随着测试自动化的普及,Selenium 已成为 Web 自动化测试的事实标准,而 Kotlin 凭借其简洁语法和高安全性,越来越受到开发者欢迎。本指南将通过一个完整的实战案例——在百度中执行搜索操作,来展示如何使用 Sele…

vscode调试stm32,Cortex Debug的配置文件lanuch.json如何写,日志

https://blog.csdn.net/jiladahe1997/article/details/122046665 https://discuss.em-ide.com/blog/67-cortex-debug 第一版 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?li…

反范式设计应用场景解析

反范式设计应用场景解析 1. 反范式设计核心概念 反范式设计是指为了特定性能优化目标,在数据库设计中故意违反关系数据库的范式规则(通常是第三范式或BC范式),通过引入冗余数据或合并表结构来提升查询效率的设计方法。 关键结论:反范式不是对范式理论的否定,而是在特定…

算法-js-子集

题&#xff1a;给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 方法一&#xff1a;迭代法 核心逻辑&#xff1a;动态扩展子集&#xff0c; 小规…

python里的NumPy算法

NumPy&#xff08;Numerical Python&#xff09;是 Python 中用于科学计算的基础库&#xff0c;提供了高性能的多维数组对象、矩阵运算以及大量数学函数库。其核心优势在于通过向量化操作替代传统循环&#xff0c;大幅提升计算效率&#xff0c;尤其适合处理大规模数据的算法实现…

HarmonyOS优化应用文件上传下载慢问题性能优化

一、概述 在开发应用时&#xff0c;客户端与服务器之间数据交换的效率取决于文件传输的性能。一个数据交换性能较低的应用会导致其在加载过程中耗费较长时间&#xff0c;在很多的场景造成页面卡顿&#xff0c;极大的影响了用户体验。相反&#xff0c;一个数据交换高效的应用&a…

64、【OS】【Nuttx】任务休眠与唤醒:clock_nanosleep

背景 之前的 blog 63、【OS】【Nuttx】任务休眠与唤醒&#xff1a;sleep 分析了任务休眠中的 sleep 函数&#xff0c;下面继续来分析下 sleep 函数中的核心功能 clock_nanosleep clock_nanosleep usleep 上篇 blog 分析了 sleep 函数&#xff0c;其核心功能封装到了 clock_…

【生产实践】华为存储XSG1在RHEL 7.x/8.x上的多路径配置操作手册(生产环境)

一、概述 本手册针对Red Hat Enterprise Linux 7.x/8.x系统与华为XSG1存储设备的多路径I/O&#xff08;MPIO&#xff09;配置&#xff0c;通过优化路径策略实现高可用、负载均衡及故障容错&#xff0c;适配华为存储硬件特性&#xff0c;满足生产环境需求。 二、参数解析与配置…

Unity开发之Webgl自动更新程序包

之前让客户端更新webgl程序是在程序里写版本号然后和服务器对比&#xff0c;不同就调用 window.location.reload(true);之前做的客户端都是给企业用&#xff0c;用户数少看不出来啥问题。后来自己开发一个小网站&#xff0c;用户数量还是挺多&#xff0c;然后就会遇到各种各样的…

一个开源脚本,可自动安装在 AMD Radeon 7900XTX 上运行选定 AI 接口所需的所有内容

​一、软件介绍 文末提供程序和源码下载 一个开源脚本&#xff0c;可自动安装在 AMD Radeon 7900XTX 上运行选定 AI 接口所需的所有内容。 二、ROCm-AI-Installer ROCm-AI-安装程序 一个开源脚本&#xff0c;可自动安装在 AMD Radeon 7900XTX 上运行选定 AI 接口所需的所有内…

【Axure结合Echarts绘制图表】

1.绘制一个矩形&#xff0c;用于之后存放图表&#xff0c;将其命名为test&#xff1a; 2.新建交互 -> 载入时 -> 打开链接&#xff1a; 3.链接到URL或文件路径&#xff1a; 4.点击fx&#xff1a; 5.输入&#xff1a; javascript: var script document.createEleme…

Relooking:损失权重λ 、梯度权重α、学习率η

一般多任务&#xff0c;大家都喜欢叠加很多损失&#xff0c;由此产生很多损失权重系数。此外&#xff0c;有的学者直接对梯度进行操作。咋一看&#xff0c;上面三个系数貌似重复多余&#xff0c;直接用其中一个系数代替不行吗&#xff1f;为此&#xff0c;回顾了下神经网络的前…

数学复习笔记 20

复习方程组&#xff0c;还有随便复习一下高数和矩阵&#xff0c;向量。现在是复习高数的导数这一章。两个曲线相切&#xff0c;列出方程&#xff0c;然后解出参数&#xff0c;没有任何难度呢。算切线方程&#xff0c;就是&#xff0c;算导数&#xff0c;导数就用导数定义&#…

Sqlalchemy 连mssql坑

连接失败: (pyodbc.OperationalError) (08001, [08001] [Microsoft][ODBC Driver 17 for SQL Server]SSL Provider: [error:0A00014D:SSL routines::legacy sigalg disallowed or unsupported] (-1) (SQLDriverConnect)) (Background on this error at: https://sqlalche.me/e/…