Performance工保科技

Virtual List (虚拟列表)

Project: 工程车辆轨迹监控系统
简历背景

"工保科技: 自研 Virtual Render 算法,实现 10万级轨迹数据渲染..."

面试题

虚拟列表的核心实现思路是什么?如何处理高度不固定的场景?

核心思路是"只渲染可视区域"。通过 scrollTop 计算出当前应该显示的 startIndex 和 endIndex。高度不固定时,需要维护一个 heightMap 缓存已渲染项的高度,或者简单点用 "预估高度" 先占位,渲染后修正。
**实现步骤:** 1. **容器**: 需要一个固定高度的外部容器 (`overflow-y: auto`)。 2. **撑开**: 内部需要一个极高的 div,高度 = 总数量 * 预估高度,为了让滚动条看起来正确。 3. **计算**: - `startIndex = Math.floor(scrollTop / itemHeight)` - `endIndex = startIndex + visibleCount` - 为了防止快速滚动白屏,通常会加一个 `buffer` (比如上下多渲染 5 个)。 4. **偏移**: 实际渲染的列表 `<ul>` 需要 `transform: translateY(startIndex * itemHeight)` 移回到可视窗口。 **不定高度解决方案:** - 这是一个难点。通常方案是 `ResizeObserver`。 - 渲染后监听 item 的实际高度,更新到 `positions` 数组中。 - 这种情况下,滚动条会有"跳动"现象,需要做滚动位置修正。