news 2026/4/15 10:27:19

你在 React 里具体做过哪些性能优化?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
你在 React 里具体做过哪些性能优化?

一、先给面试官一个总览(很重要)

在 React 项目中,我主要从渲染控制、计算缓存、数据层、组件拆分四个方面做过性能优化,针对的都是列表、表格和图表等高频性能瓶颈场景。


二、具体做过哪些优化(重点部分)


1️⃣ 列表 / 表格:虚拟列表(最硬核)

在性能查询和问题列表页面,数据量可能上千条,如果直接渲染会导致首屏和滚动卡顿。

做法:

  • 使用虚拟列表(如react-window/ AntD 虚拟表格)

  • 只渲染可视区域的 DOM

<FixedSizeList height={500} itemCount={list.length} itemSize={48} > {Row} </FixedSizeList>

效果:

  • DOM 数量从几千降到几十

  • 滚动明显流畅

👉这是面试官最认可的一点


2️⃣ useMemo:缓存计算结果(你前面问过)

一些表头配置、筛选后的数据、图表数据处理计算量比较大,如果每次渲染都重新计算,会有性能浪费。

const columns = useMemo(() => getColumns(config), [config]); const filteredList = useMemo(() => filterData(list, params), [list, params]);

关键点:

  • 只缓存计算结果

  • 依赖必须准确


3️⃣ useCallback:稳定函数引用,减少子组件重渲染

在表格和列表中,我们会把事件处理函数传给子组件,如果每次渲染函数都变化,会导致子组件不必要的更新。

const onRowClick = useCallback((row) => { setCurrent(row); }, []);

配合:

export default React.memo(Row);

4️⃣ React.memo:避免不必要的组件更新

对于纯展示组件,比如表格行、图表容器,我们使用React.memo包裹,只有 props 变化才重新渲染。

const Row = React.memo(({ data }) => { return <div>{data.name}</div>; });

5️⃣ 拆分组件,缩小更新范围(非常真实)

一开始筛选条件和列表在一个组件里,任何筛选变化都会导致整个页面重渲染,后来我们把筛选区、列表区、图表区拆成独立组件。

原则:

  • 状态就近管理

  • 减少顶层 state 数量


6️⃣ 图表性能优化(ECharts 场景)

图表数据量比较大,我们做了几件事:

  • 图表组件懒加载

  • 只有数据变化才重新 setOption

  • 数据变化时用useMemo预处理

const chartOption = useMemo(() => buildOption(data), [data]);

7️⃣ 接口 & 渲染配合优化(不是只会 React)

我们也配合后端做了接口合并、分页和按需加载,避免一次性拉取大量数据。


三、你可以补一句“我怎么验证优化效果”(加分)

优化过程中我们会通过 Chrome Performance、React DevTools Profiler 观察组件渲染次数和耗时,确保优化是有效的。


四、总结一句话(收尾)

总体来说,我在 React 中主要通过虚拟列表减少 DOM 数量,useMemo / useCallback 控制渲染,组件拆分缩小更新范围,再结合接口层面的优化,来保证在大数据量场景下页面依然流畅。


五、30 秒极速版(如果面试官催)

列表用虚拟列表,复杂计算用 useMemo,事件函数用 useCallback,配合 React.memo 减少无效渲染,再通过组件拆分和按需加载控制更新范围。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 17:43:17

内容复习--分子niche与细胞niche的区别

作者&#xff0c;Evil Genius先给大家一张分析的思路图其实很多学员问&#xff0c;说文章对visium的注释直接联合即可&#xff0c;后续分析细胞niche才会多样本比较&#xff0c; 而且用的是细胞矩阵&#xff0c;那么多样本的基因矩阵整合还有没有必要做呢&#xff1f;其实问题的…

作者头像 李华
网站建设 2026/4/12 10:06:16

我家10岁娃用AI 没写一行代码 开发马里奥小游戏

作为家长&#xff0c;我一直鼓励孩子接触科技实践&#xff0c;没想到最近他用AI零代码工具&#xff0c;亲手做出了简化版马里奥小游戏&#xff01;从构思到成型只用了3天&#xff0c;全程没写一行代码&#xff0c;全靠AI生成和拖拽操作。下面就把孩子的开发全过程整理出来&…

作者头像 李华
网站建设 2026/4/12 8:46:10

健康有益 AI 营养系统:企业级膳食管理智能化落地全攻略

全民健康意识的全面觉醒&#xff0c;正推动膳食管理需求从基础温饱向科学营养迭代升级。在此背景下&#xff0c;作为预防医学的重要分支&#xff0c;健康膳食分析管理彻底告别传统经验式指导模式&#xff0c;迈入科学量化管理的新阶段。它通过精准解析饮食结构、营养摄入与健康…

作者头像 李华
网站建设 2026/4/11 20:45:49

某大型集团管控信息化战略规划项目系列之蓝图设计方案 – 基础设施架构(BPIT运营模式):智能混合云与BPIT(业务驱动的IT)运营模式

本方案为XX集团构建了一套以云为核心、服务为导向、安全为基石的现代化IT基础设施架构&#xff0c;不仅解决了历史遗留的系统孤岛与资源浪费问题&#xff0c;更为未来业务创新与数字化转型提供了坚实、灵活、智能的技术支撑。通过分阶段实施与持续优化&#xff0c;最终实现IT从…

作者头像 李华
网站建设 2026/4/13 17:35:45

对比测试:传统import与IMPORT.META.GLOB的效率差异

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个性能对比测试项目&#xff1a;1. 传统手动import方式实现100个组件导入 2. IMPORT.META.GLOB自动导入相同组件 3. 对比两种方式的&#xff1a;a) 代码量 b) 构建时间 c) 运…

作者头像 李华
网站建设 2026/4/13 22:47:42

Typst实战:从零开始构建学术论文模板

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个Typst项目&#xff0c;用于生成学术论文模板。功能包括&#xff1a;1. 自动生成目录和章节编号&#xff1b;2. 支持BibTeX参考文献管理&#xff1b;3. 提供常见的图表排版…

作者头像 李华