2023-02-20 06:36:38
实现分页加载更多需结合前端滚动监听、后端分页查询及性能优化策略,核心步骤如下:
一、前端实现基础逻辑监听滚动事件
监听目标容器(如 window 或特定滚动区域)的 scroll 事件,通过 addEventListener 绑定回调函数。
示例代码:
window.addEventListener('scroll', handleScroll);判断滚动触底
计算关键值:
scrollTop:滚动条距离顶部的距离。
clientHeight:可视区域高度。
scrollHeight:内容总高度(含不可见部分)。
触底条件:if (scrollTop + clientHeight >= scrollHeight - offset) { loadMoreData();}
offset 为缓冲值(如 50px),提前触发加载以避免用户等待。
加载数据函数 loadMoreData()
防重复加载:使用 isLoading 标志位,避免请求重叠。
分页参数:维护 currentPage(当前页码)和 pageSize(每页数据量)。
请求与处理:let currentPage = 1;const pageSize = 10;let isLoading = false;async function loadMoreData() { if (isLoading) return; isLoading = true; try { const response = await fetch(`/api/data?page=${currentPage}&pageSize=${pageSize}`); const data = await response.json(); if (data.length > 0) { appendDataToPage(data); // 渲染数据 currentPage++; } else { showNoMoreData(); // 显示无数据提示 } } catch (error) { showError(error); // 显示错误提示 } finally { isLoading = false; }}
分页查询实现
使用 LIMIT 和 OFFSET(MySQL 示例):SELECT * FROM your_table LIMIT pageSize OFFSET (page - 1) * pageSize;
优化建议:
大数据量时改用 游标分页(如基于主键的 WHERE id > last_id),避免 OFFSET 性能问题。
支持排序和过滤:通过参数传递排序字段(如 sort=created_at)和过滤条件(如 status=active)。
RESTful 接口规范
统一返回格式:{ "code": 200, "message": "success", "data": [...], "total": 100 // 可选:总数据量}
错误码定义:
400:参数错误
500:服务器内部错误
429:请求过于频繁
虚拟滚动
仅渲染可视区域内的数据,减少 DOM 节点数。
推荐库:
React:react-window、react-virtualized
Vue:vue-virtual-scroller
节流(Throttling)
限制 scroll 事件触发频率,减少无效计算。
示例:function throttle(func, delay) { let lastCall = 0; return function(...args) { const now = new Date().getTime(); if (now - lastCall < delay) return; lastCall = now; return func.apply(this, args); };}window.addEventListener('scroll', throttle(handleScroll, 200));
预加载与缓存
预加载:当用户滚动至距离底部一定距离时,提前加载下一页数据。
缓存:使用 localStorage 或内存缓存已加载数据,避免重复请求。
错误提示与重试
请求失败时显示错误信息(如“加载失败,点击重试”),并提供重试按钮。
实现自动重试机制(如最多重试 3 次)。
加载状态反馈
显示加载动画(如旋转图标)或骨架屏,提升用户体验。
无数据提示
当后端返回空数组时,显示“没有更多数据了”的提示。
通过以上步骤,可实现高效、稳定的分页加载功能,适应不同规模的数据场景。