为什么我的React组件在频繁更新时性能报告显示LCP和FID变差?
我在开发一个实时数据看板,父组件每秒接收新数据并重新渲染。使用React.memo包裹子组件后,性能报告里LCP从2.3s恶化到4.1s,FID也从50ms变成300ms。明明用了memo,为什么性能反而更差了?
代码结构大概是这样,子组件接收过滤后的数据列表:
function DataList({ data }) {
return <div>{data.map(item => (
<Item key={item.id} value={item.value} />
))}</div>;
}
export default React.memo(DataList);
我尝试过在父组件用useCallback包裹数据处理函数,但问题依旧。性能面板显示主要卡在”Paint”阶段,而且FCP正常,问题只出现在后续更新时。难道是虚拟DOM diff算法的问题吗?
另外考虑节流更新,16ms更新一次就够了,人眼也看不出差别。
React.memo只是避免子组件重复渲染,但你在父组件频繁更新 state 依然会触发整体 re-render,LCP 和 FID 变差是因为主线程被频繁占用,导致页面响应变慢。你应当在父组件用
useMemo缓存data,避免每次传入新引用,否则React.memo也没用。修改父组件数据处理部分类似这样:
这样
DataList组件才不会因为data引用变化而强制更新。