当前位置: 首页 > 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.lryc.cn/news/620079.html

相关文章:

  • React常见的Hooks
  • 万字详解C++11列表初始化与移动语义
  • OpenCV的实际应用
  • 类和对象----中
  • 【COMSOL】Comsol学习案例时的心得记录分享
  • Mysql数据库迁移到GaussDB注意事项
  • pycharm配置连接服务器
  • 3.Cursor提效应用场景实战
  • MySQL相关概念和易错知识点(6)(视图、用户管理)
  • 大厂语音合成成本深度对比:微软 / 阿里 / 腾讯 / 火山 API 计费拆解与技术选型指南
  • trace分析之查找点击事件
  • cisco无线WLC flexconnect配置
  • python类--python011
  • 数仓建模理论-数据域和主题域
  • 8.13服务器安全检测技术和防御技术
  • 免费生成视频,Coze扣子工作流完全免费的视频生成方案,实现图生视频、文生视频
  • [ Mybatis 多表关联查询 ] resultMap
  • LeetCode Day5 -- 二叉树
  • 使用 HTML5 Canvas 打造炫酷的数字时钟动画
  • Kubernetes-03:Service
  • 对线面试官之幂等和去重
  • 【OpenGL】LearnOpenGL学习笔记07 - 摄像机
  • 会议征稿!IOP出版|第二届人工智能、光电子学与光学技术国际研讨会(AIOT2025)
  • 【Android】RecyclerView多布局展示案例
  • [系统架构设计师]架构设计专业知识(二)
  • Linux 计划任务
  • 《书写范式》——代码如诗,诗娟代码(Python)(附精巧“九九表”生成代码)
  • Coze Studio 概览(十)--文档处理详细分析
  • k8s资源管理
  • 【android bluetooth 协议分析 05】【蓝牙连接详解3】【app侧该如何知道蓝牙设备的acl状态】