React 性能优化指南
别瞎优化,先用 DevTools 找到瓶颈
核心思路
React 性能优化不只是在组件上加 memo:先定位瓶颈,再分别处理不必要的重渲染、过大的渲染范围、过长的任务和过大的首屏包体。
1. 避免不必要的重渲染
把 State 往下移
如果父组件有个频繁变化的 State,但只有一小块 UI 用到了它,就把这块 UI 拆成子组件:
React.memo(有成本,按需使用)
对不常变化的子组件用 React.memo:
memo 做的是浅比较,但比较本身也有成本;只有组件渲染开销明显、且 props 经常保持稳定时才值得使用。它也不能阻止组件读取的 Context 变化带来的更新。
2. 保持引用稳定
如果用了 memo,函数、对象、数组等非原始值每次渲染都可能产生新引用。只有这些引用变化确实导致昂贵子树重渲染时,才需要稳定它们:
useCallback — 缓存函数
useMemo — 缓存对象/计算结果
3. 列表优化
Key 要用唯一 ID
详见虚拟 DOM 与 Diff 算法中的 Key 说明。
虚拟列表
数据量很大、且列表项渲染成本高时,再考虑 react-window 等虚拟列表;它会增加测量、滚动和可访问性处理的复杂度,并不是所有列表都应该默认使用。
4. Context 优化
Provider 的 value 引用变化会让使用该 Context 的消费者重新检查;即使消费者只读取其中一个字段,也可能被同一个 Context 的其他字段变化牵连。
拆分成多个 Context
value 用 useMemo 缓存
5. 懒加载
首屏不用的组件,延迟加载:
怎么知道哪里慢?
React DevTools Profiler
- 打开 DevTools → Profiler
- 点击录制
- 做交互
- 对比提交耗时、渲染次数和组件树,确认真正的热点
勾选 "Record why each component rendered",可以看到重渲染的原因。
总结
记住:优化之前先 Profiler,找到瓶颈再动手,别凭感觉瞎优化。
一条实用排查顺序
先确认是否存在请求瀑布或首屏包过大,再看组件是否渲染了过多内容,最后才处理 memo、缓存和 Context 拆分。优化后重新录制并比较指标,避免“代码更复杂了,但用户没有感知到更快”。

