總數據量較小(< 1000 條),首屏渲染 8 條,滾動到底部逐批追加 8 條,避免頻繁請求接口。
allData,前端緩存至變量/狀態。pageIndex(當前頁)、pageSize = 8。window.onscroll 或 IntersectionObserver 判斷到底部。allData.slice(pageIndex*pageSize, (pageIndex+1)*pageSize) 追加 DOM。let allData = [], pageIndex = 0, pageSize = 8;
const list = document.getElementById('list');
const loader = document.getElementById('loader');
async function fetchData() {
const res = await fetch('/api/all-items');
allData = await res.json();
renderNext();
}
function renderNext() {
const start = pageIndex * pageSize;
const chunk = allData.slice(start, start + pageSize);
if (!chunk.length) {
loader.textContent = 'T_T 沒有新數據了...';
return;
}
chunk.forEach(item => {
const li = document.createElement('li');
li.textContent = item.title;
list.appendChild(li);
});
pageIndex++;
}
window.addEventListener('scroll', () => {
if (window.innerHeight + window.scrollY >= document.body.offsetHeight - 50) {
renderNext();
}
});
fetchData();
react-window / vue-virtual-scroller 只渲染可視區。lodash.throttle 降低觸發頻率。一次性加載 + 本地分頁 = 簡單、低延遲、適合中小數據集的「偽無限滾動」方案。