React大数据渲染优化:RequestIdleCallback API高效解决页面卡顿和闪烁
React应用渲染大量数据时,常出现页面卡顿或闪烁。本文介绍如何利用requestIdleCallback API优化渲染效率,尤其适用于数据项高度不固定、难以使用虚拟列表优化的场景。
问题根源在于一次性渲染所有数据超出了浏览器处理能力,导致渲染阻塞。解决方案是将数据分批处理,利用浏览器空闲时间逐步渲染。
以下是一个自定义Hook usePerformTask,它巧妙地运用requestIdleCallback:
const usePerformTask = <T>(data: T[], run: (batch: T[]) => void, batchSize = 10) => { const dataRef = useRef(data); useEffect(() => { dataRef.current = data; }, [data]); useEffect(() => { let isCancelled = false; const performTask = (deadline: IdleDeadline) => { while (!isCancelled && dataRef.current.length > 0 && deadline.timeRemaining() > 0) { const batch = dataRef.current.splice(0, batchSize); run(batch); } if (!isCancelled && dataRef.current.length > 0) { requestIdleCallback(performTask); } }; requestIdleCallback(performTask); return () => { isCancelled = true; }; }, [batchSize]); };
此Hook接收三个参数:data(待渲染数据数组)、run(处理数据批次的函数)、batchSize(每次处理的数据量)。它使用useRef跟踪数据,useEffect控制渲染过程。
核心逻辑在performTask函数中:它在浏览器空闲时,每次处理batchSize数量的数据,并用deadline.timeRemaining()判断剩余时间,避免阻塞主线程。 数据未处理完则递归调用requestIdleCallback,直至所有数据渲染完毕。isCancelled变量用于处理组件卸载,防止不必要的计算。
通过这种分批处理,有效避免页面闪烁,提升用户体验。