2020-10-05 04:33:06
长列表优化是通过懒渲染或可视区域渲染(如虚拟列表)减少非可见区域的DOM操作,提升渲染性能的技术方案。以下是具体优化方案及使用建议:
一、长列表的核心问题将数据源转换为二维数组(如每10条为一组)。
监听滚动事件,当底部占位DOM进入可视区域时,触发下一组数据的渲染。
可滚动区域:总数据量 × 单项高度(如1000条 × 30px = 30000px)。
可见区域:列表容器的高度(如300px),用户滚动时动态更新可见内容。
预计算所有列表项的位置信息(如偏移量、高度)。
根据滚动偏移量(offset)和位置信息,动态计算当前可见区域应渲染的列表项。
通过绝对定位或transform调整可见项的位置,模拟连续滚动效果。
DOM节点数恒定(仅渲染可见项),内存占用低。
滚动流畅,适合超大数据量(如万级以上)。
Ant Design 官方推荐的虚拟列表库,支持无限滚动、动态高度等场景。
提供 List、Grid 等组件,通过 rowRenderer 自定义渲染逻辑。
示例代码:
import { List } from 'react-virtualized';const rowRenderer = ({ index, key, style }) => ( <div key={key} style={style}>Item {index}</div>);<List width={300} height={600} rowCount={1000} rowHeight={50} rowRenderer={rowRenderer}/>基于 Vue 的虚拟列表组件,支持动态高度、反向滚动等特性。
通过 v-for 和 item-key 绑定数据,自动处理渲染逻辑。
示例代码:
<template> <virtual-scroll-list :data-key="'id'" :data-sources="items" :data-component="ItemComponent" :item-height="50" /></template>使用 IntersectionObserver 监听底部占位元素的可见性,触发数据加载。
示例伪代码:
const observer = new IntersectionObserver((entries) => { if (entries[0].isIntersecting) loadMoreItems();});observer.observe(document.getElementById('load-more'));计算可见区域范围(如 startIndex 到 endIndex)。
根据滚动偏移量动态设置容器高度和列表项位置。
示例关键逻辑:
const visibleCount = Math.ceil(containerHeight / itemHeight);const startIndex = Math.floor(scrollTop / itemHeight);const endIndex = startIndex + visibleCount;通过合理选择优化方案,可显著提升长列表的渲染性能和用户体验。