MUI React DataGrid打印导出时页面崩溃无响应问题求助
解决方案
1. 先定位问题根因
- MUI DataGrid 默认打印逻辑会全量渲染所有行到DOM节点中,如果你的异步接口返回的rows数据量超过1000条,很容易因为DOM节点短时间暴增导致页面卡死。
- 验证方式:给接口加临时限制仅返回100条以内数据,测试打印是否正常,如果恢复正常即可确定是全量渲染性能问题。
2. 优先添加官方打印优化配置
直接在DataGrid组件上添加以下属性即可解决绝大多数场景的卡顿问题:
<DataGrid // 你的其他原有属性,比如rows、columns、pagination等 printOptions={{ hideFooter: true, includeCheckboxes: false, // 核心配置:开启分页打印,仅渲染当前页数据 printByPage: true, }} // 保持虚拟化开关开启,避免全量渲染 disableVirtualization={false} />
注意printByPage为v5及以上版本支持的属性,如果你用的是旧版本,可以先升级到当前大版本的最新稳定版。
3. 兼容异步数据加载逻辑
你的rows是异步请求获取的,要避免打印触发时数据还在加载、同时触发多重渲染导致卡死:
- 给打印按钮加禁用状态,请求未完成时不可点击,示例代码:
const [rows, setRows] = useState([]); const [dataLoading, setDataLoading] = useState(true); const gridApiRef = useRef(null); useEffect(() => { const fetchRows = async () => { setDataLoading(true); const res = await fetch("你的接口地址"); const result = await res.json(); setRows(result); setDataLoading(false); }; fetchRows(); }, []); // 打印按钮 <Button disabled={dataLoading} onClick={() => gridApiRef.current?.print()} > 打印数据 </Button>
确保你使用DataGrid官方提供的apiRef调用打印方法,不要自己实现原生打印逻辑。
4. 大数据量场景替代方案
如果你的业务必须打印超过2000行的全量数据,建议放弃默认打印功能,走轻量化自定义方案:
- 自行拿到需要打印的rows数据,生成简化的纯文本table DOM插入到页面隐藏容器中,调用原生
window.print()执行打印,完成后移除临时DOM - 优先引导用户使用CSV导出功能,导出后用办公软件打开打印,MUI的CSV导出性能远高于打印功能,不会出现卡顿问题。
5. 其他排查点
- 检查是否给单元格/行做了复杂的自定义渲染,比如每个单元格都有复杂组件、动画、事件绑定,这些内容打印时会全量渲染,会大幅提升性能开销。可以通过
getCellClassName给自定义单元格增加打印专用类名,用打印媒体查询隐藏复杂内容仅展示纯文本。 - 检查是否有全局的useEffect/useMemo依赖了rows,打印时触发重复计算导致死循环。
内容的提问来源于stack exchange,提问作者paul10
相关产品推荐
相关产品推荐

