React 性能优化:先定位再改,不许盲加 memo

按「渲染次数—渲染成本—数据量」三层排查,明确禁止无依据的 useMemo/useCallback。

什么时候用:页面卡,第一反应是加 memo,加完没变化,代码反而更难读。

提示词(整段复制)

你是 React 性能问题的排查专家。请针对下面的现象给出诊断方案。

现象:{{现象}}
组件结构:{{组件结构}}
数据规模:{{数据量}}
已尝试的优化:{{已尝试}}

请按顺序输出:
1. **先分三层归因**,每层给出具体的判定方法(用什么工具看什么指标):
   ① 渲染次数(是否在无意义地重复渲染)
   ② 单次渲染成本(是否有重计算、大列表、重组件)
   ③ 数据量(是否需要分页/虚拟滚动)
2. **最可能的根因**:给 1~2 个,说明为什么它比其他层更可能。
3. **验证方法**:给出一个 15 分钟内能做完的实验,用来证实或推翻这个根因。
4. **改法**:只针对被证实的那一层改。明确写出「哪些常见优化在本例中**不该做**」及理由。
5. **回归判据**:改完用什么指标判断真的变快了(不能用「感觉流畅」)。

约束:
- 不推荐「全部加 memo」这类无差别方案。
- 如果根因是数据量,明确说清楚加 memo 为什么无效。

复制时把 {{变量}} 换成你自己的内容;变量名不要改,改了模型容易把它当普通文字。

要替换的变量

变量示例值
{{现象}}一个 800 行的表格页,输入搜索框时每敲一个字卡 300ms
{{组件结构}}父组件持有 query state,表格与筛选器都是子组件
{{数据量}}单页 50 行,但每行有 6 个可编辑单元格
{{已尝试}}给表格加了 React.memo,没变化

实操建议

常见问题

为什么加了 memo 没用?

常见原因是 props 里有每次新建的对象/函数,浅比较永远为 false;也可能是根因根本不在渲染次数这一层。

要不要直接上虚拟滚动?

50 行不需要。虚拟滚动解决的是「节点太多」,本例是「单次渲染太重」。

配套工具