PC端上拉加载效果

自定义列表样式,不使用原始的上一页下一页翻页效果,替换为上拉加载数据,无限滚动的形式

定义变量

const listContainer = ref<HTMLElement>(); // 滚动容器Ref

const stationList = ref<any\[\]>(\[\]); // 列表

const loading = ref(false); // 加载中(防重复请求)

const noMore = ref(false); // 无更多数据

const page = ref(1); // 当前页码

const pageSize = ref(10); // 每页固定10条

const total = ref(45); // 总数据量(模拟45条,可加载5页,最后一页5条)
// 加载场站数据(真实项目替换此函数)

const fetchStationList = async () => {

if (loading.value) return; // 防止重复触发

loading.value = true;

try {

// 真实项目替换为下面的接口请求

// const res = await defHttp.get({

// url: '/api/charging/station/list', // 实际接口地址

// params: { ...filters.value, page: page.value, pageSize: pageSize.value }

// });

// const { list, total: totalNum } = res;

// stationList.value = ...stationList.value, ...list;

// total.value = totalNum;

// 模拟接口请求(测试用,真实项目删除)

await new Promise(resolve => setTimeout(resolve, 600)); // 模拟接口延迟

const mockList = Array(pageSize.value).fill(0).map((_, index) => {

const id = (page.value - 1) * pageSize.value + index + 1;

return {

id,

name: `列表${id}`,

todayAmount: (Math.random() * 800).toFixed(2),

yesterdayAmount: (Math.random() * 2500).toFixed(2),

utilizationRate: (Math.random() * 100).toFixed(2) + '%',

weekAvgAmount: (Math.random() * 1800).toFixed(2),

dcCount: Math.floor(Math.random() * 300) + 4,

charging: Math.floor(Math.random() * 15),

gunOccupy: Math.floor(Math.random() * 8),

fault: Math.floor(Math.random() * 10),

idle: Math.floor(Math.random() * 200),

fullOccupy: Math.floor(Math.random() * 6),

offline: Math.floor(Math.random() * 25),

};

});

stationList.value = ...stationList.value, ...mockList;

// 判断是否无更多数据

if (stationList.value.length >= total.value) {

noMore.value = true;

ElMessage.info('已加载全部数据');

}

} catch (error) {

console.error('加载数据失败:', error);

ElMessage.error('数据加载失败,请稍后重试');

} finally {

loading.value = false;

}

};

滚动监听核心逻辑

javascript 复制代码
const handleScroll = () => {
  const container = listContainer.value;
  if (!container || loading.value || noMore.value) return;

  // 只要加载过1页(>=10条)就允许触发下一页
  const hasLoadOnePage = stationList.value.length >= pageSize.value;
  if (!hasLoadOnePage) return;

  const { scrollTop, scrollHeight, clientHeight } = container;
  // 提前20px触发加载,避免浏览器渲染误差
  const isNearBottom = scrollTop + clientHeight >= scrollHeight - 20;
  

  if (isNearBottom) {
    page.value += 1;
    fetchStationList();
  }
};
相关推荐
万粉变现经纪人29 分钟前
2026最新Windows11系统CMD安装Claude Code 快速接入DeepSeek V4 Pro在VSCode编程工具中使用保姆级入门教程指南
linux·运维·ide·windows·vscode·macos·编辑器
jike88ai37 分钟前
Windows版Claude Code安装与API对接教程(附常见问题解决)
windows·gpt·node.js·claude·claudecode·88api
love530love2 小时前
【笔记】ComfyUI 源码部署版更新后一键修复:从手动补丁到自动化工作流
运维·人工智能·windows·笔记·python·自动化·comfyui
PieroPc2 小时前
AirDisk NAS Viewer 通过 HTTP 服务或 Windows 网络驱动器
网络·windows·http
爱和冰阔落3 小时前
Linux/Windows 双平台通关:YOLOv8 目标检测从模型选型到跨平台部署实战
linux·windows·yolo
七仔啊3 小时前
windows server服务器验机流程
运维·服务器·windows
ID_180079054733 小时前
TikTok 视频详情 & 列表 API 接口技术文档(带全套 JSON 样例・核心章节)
linux·windows·microsoft
天才程序YUAN3 小时前
Windows 11 C 盘扩容完整教程:恢复分区拦路、页面文件锁盘、WinRE 重建全记录
c语言·开发语言·windows
兔老大RabbitMQ3 小时前
涉及泛型的强制转换
linux·windows·microsoft