useMemo 用于缓存计算结果,避免不必要的重复计算,提升性能。

useMemo Hook 详解

useMemo 用于缓存计算结果,只有当依赖项变化时才重新计算。

// 基本语法

const memoizedValue = useMemo(
  () => expensiveComputation(a, b),
  [a, b] // 依赖项数组
);

示例 1: 复杂计算的缓存

当前: 10,000

找到的质数数量

1,229

计算耗时

3.03 ms

测试方法:
  1. 先启用 useMemo,切换暗色模式,观察计算时间(应该很短或为 0)
  2. 禁用 useMemo,切换暗色模式,观察计算时间(每次都需要重新计算)

示例 2: 列表过滤与排序

AirPods Pro

配件

¥1,899

Apple Watch

配件

¥2,999

Huawei Mate 60

手机

¥5,999

iPad Air

平板

¥4,799

iPhone 15

手机

¥7,999

MacBook Pro

电脑

¥14,999

Samsung S24

手机

¥6,999

ThinkPad X1

电脑

¥12,999

小米平板

平板

¥2,499

索尼耳机

配件

¥2,599

组件渲染次数: 1

过滤计算次数: 1

观察: 点击“强制重渲染”,渲染次数增加,但过滤计算次数不变(因为依赖项没变)

示例 3: 避免子组件重渲染

父组件状态: 0

子组件渲染次数: 0

Item 1
Item 2
Item 3

原理:

  • 子组件用 memo 包裹,props 不变时不重渲染
  • 不用 useMemo:每次父组件渲染都创建新数组(引用不同)
  • 用 useMemo:数组引用保持稳定,子组件不重渲染

示例 4: 派生状态计算

商品 A

¥99 x 2

2

商品 B

¥199 x 1

1

商品 C

¥49 x 3

3
商品数量:6
商品总价:¥544.00
包邮:已包邮
折扣:-15%
应付:¥462.40
派生状态链: cart → total → freeShipping/discount → finalTotal

每个派生状态只在其依赖变化时重新计算

useMemo 使用指南

✅ 适合使用

  • 复杂计算(O(n²) 或更高)
  • 大型数据过滤/排序
  • 对象/数组传给 memo 子组件
  • 计算派生状态

❌ 不需要使用

  • 简单计算(字符串拼接等)
  • 原始值(数字、字符串)
  • 无性能问题时过早优化
  • 已使用 React Compiler