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

React useMemo 深度指南:原理、误区、实战与 2025 最佳实践

把“为什么用、怎么用、用错了怎么办”一次讲透,附 React 19 自动优化前瞻


一、useMemo 是什么?

一句话:
useMemo = 记住(缓存)昂贵计算结果,只在依赖变化时重新计算。

const memoValue = useMemo(() => {return heavyCompute(a, b);
}, [a, b]);
  • 第 1 个参数:计算函数,必须返回一个值。
  • 第 2 个参数:依赖数组,React 用 Object.is 比对。
  • 返回值:缓存值,依赖不变就复用。

二、使用场景 3+1

场景示例收益
昂贵计算大数据过滤 / 排序 / 图表计算避免每次渲染重算
稳定引用把对象/数组传给子组件配合 React.memo 减少子组件重渲染
函数缓存返回函数时用 useCallback 语法糖防止子组件 props 变化
React 19 之前手动优化瓶颈React 19 编译器将自动处理

三、实战:Todo 列表性能优化

问题:每次添加 todo,都重新过滤 1000 条数据

function TodoList({ todos, filter }) {// ❌ 每次渲染都执行 filterTodosconst visibleTodos = filterTodos(todos, filter);return visibleTodos.map(todo => <li key={todo.id}>{todo.text}</li>);
}

解决:useMemo 缓存过滤结果

function TodoList({ todos, filter }) {const visibleTodos = useMemo(() => filterTodos(todos, filter),[todos, filter]);return visibleTodos.map(todo => <li key={todo.id}>{todo.text}</li>);
}

依赖 [todos, filter] 不变,filterTodos 只在依赖变化时运行。


四、常见误区与对策

误区后果对策
依赖项漏写缓存值不更新使用 ESLint react-hooks/exhaustive-deps
过度使用缓存成本 > 计算成本先写简单代码,后优化
返回函数误用 useMemo(() => fn)改用 useCallback(fn, deps)

五、React 19 之后:还要手动用吗?

React 19 编译器 已能 自动记忆化

  • 大部分场景 无需手写 useMemo/useCallback
  • 仅在 第三方库要求引用稳定极端昂贵计算 时手动使用。

六、一键记忆化模板

import { useMemo } from 'react';export function useExpensiveValue<T>(factory: () => T, deps: any[]): T {return useMemo(factory, deps);
}// 用法
const data = useExpensiveValue(() => heavyCompute(a, b), [a, b]);

七、一句话总结

useMemo = “计算缓存”,只在依赖变化时重算;React 19 之前手动优化瓶颈,之后让编译器兜底

http://www.dtcms.com/a/329103.html

相关文章:

  • 【SpringBoot系列-01】Spring Boot 启动原理深度解析
  • C->C++核心过渡语法精讲与实战
  • 深度学习——03 神经网络(2)-损失函数
  • Spring Boot 使用 @NotBlank + @Validated 优雅校验参数
  • react+antd+vite自动引入组件、图标等
  • 适配安卓15(对应的sdk是35)
  • 单片机启动流程详细介绍
  • 开源WAF新标杆:雷池SafeLine用语义分析重构网站安全边界
  • vscode远程服务器出现一直卡在正在打开远程和连接超时解决办法
  • SpringBoot 整合 Langchain4j 系统提示词与用户提示词实战详解
  • IV模型(工具变量模型)
  • 《论文阅读》从特质到移情:人格意识多模态移情反应生成 ACL 2025
  • Dify-17: 扩展模型提供方
  • PyTorch简介
  • layui表格自定义导出数据(选中和全部数据)
  • Debian新一代的APT软件源配置文件格式DEB822详解
  • k8s中的微服务
  • CSS动态视口单位:彻底解决移动端适配顽疾,告别布局跳动
  • Prompt Engineering+AI工具链:打造个人专属的智能开发助手
  • 第六十六篇:AI模型的“口才”教练:Prompt构造策略与自动化实践
  • 从0开始跟小甲鱼C语言视频使用linux一步步学习C语言(持续更新)8.13
  • SplitLanzou安卓版(蓝奏云第三方客户端) v1.8.2 免费版
  • 云计算-实战 OpenStack 私有云运维:服务部署、安全加固、性能优化、从服务部署到性能调优(含数据库、内核、组件优化)全流程
  • 飞凌OK3568开发板QT应用程序编译流程
  • Nginx 超详细详解和部署实例
  • 大致计算服务器磁盘使用情况脚本
  • 从零到一:TCP 回声服务器与客户端的完整实现与原理详解
  • pycharm配置连接服务器
  • 解析Vue3中集成WPS Web Office SDK的最佳实践
  • 物理服务器和虚拟机在性能上的不同