当前位置: 首页 > article >正文

vue实现滚动下拉加载更多

在 Vue 项目中实现滚动下拉加载更多功能,可以通过以下步骤完成:


1. 确定需求

  • 当页面滚动到一定位置时,触发加载更多数据的操作。
  • 避免频繁触发请求,可以使用节流或防抖。

2. 基本实现

(1)HTML 结构

确保页面有一个可以滚动的容器:

<template>
  <div class="scroll-container" @scroll="handleScroll">
    <ul>
      <li v-for="item in items" :key="item.id">{{ item.text }}</li>
    </ul>
    <div v-if="loading" class="loading">加载中...</div>
    <div v-if="allLoaded" class="end">没有更多内容了</div>
  </div>
</template>
(2)CSS 样式

设置容器可滚动:

.scroll-container {
  height: 500px;
  overflow-y: auto;
  border: 1px solid #ccc;
}

ul {
  list-style: none;
  padding: 0;
}

.loading, .end {
  text-align: center;
  padding: 10px 0;
}
(3)Vue 逻辑

实现滚动检测和数据加载:

<script>
export default {
  data() {
    return {
      items: [], // 数据列表
      loading: false, // 是否正在加载
      allLoaded: false, // 是否加载完成
      page: 1, // 当前页码
      pageSize: 10, // 每页条数
    };
  },
  mounted() {
    // 初始化加载数据
    this.loadMore();
  },
  methods: {
    // 滚动事件处理
    handleScroll(event) {
      const container = event.target;
      const scrollTop = container.scrollTop; // 已滚动距离
      const scrollHeight = container.scrollHeight; // 滚动内容高度
      const clientHeight = container.clientHeight; // 可视区域高度

      // 如果滚动到底部,并且没有在加载中
      if (scrollTop + clientHeight >= scrollHeight - 10 && !this.loading && !this.allLoaded) {
        this.loadMore();
      }
    },
    // 加载更多数据
    async loadMore() {
      this.loading = true;
      try {
        const newItems = await this.fetchData(this.page, this.pageSize);
        if (newItems.length < this.pageSize) {
          this.allLoaded = true; // 如果返回的数据不足一页,标记为全部加载
        }
        this.items = [...this.items, ...newItems];
        this.page++;
      } catch (error) {
        console.error('加载失败:', error);
      } finally {
        this.loading = false;
      }
    },
    // 模拟异步数据获取
    fetchData(page, pageSize) {
      return new Promise((resolve) => {
        setTimeout(() => {
          const start = (page - 1) * pageSize;
          const end = start + pageSize;
          const newItems = Array.from({ length: Math.min(pageSize, 50 - start) }, (_, i) => ({
            id: start + i + 1,
            text: `${start + i + 1} 条数据`,
          }));
          resolve(newItems);
        }, 1000);
      });
    },
  },
};
</script>

3. 代码解析

  • 滚动检测@scroll 绑定到滚动容器,实时检测滚动位置。
  • 加载数据loadMore 负责加载新数据并更新 items,同时更新状态 loadingallLoaded
  • 模拟异步fetchData 模拟了一个异步获取数据的接口。

4. 优化

(1)节流防抖

防止滚动事件触发频率过高:

import throttle from 'lodash/throttle';

methods: {
  handleScroll: throttle(function(event) {
    // 滚动逻辑
  }, 200),
}
(2)骨架屏

加载时显示占位内容,提升用户体验。

(3)接口对接

实际开发中,将 fetchData 替换为真实的接口调用。


5. 注意事项

  • 确保容器的 overflow-yautoscroll
  • 滚动到容器底部时的边界判断要考虑浮点误差(>= scrollHeight - 10)。
  • 控制状态,防止重复加载。

http://www.kler.cn/a/403669.html

相关文章:

  • mongodb多表查询,五个表查询
  • MySQL数据库-索引的介绍和使用
  • 如何删除Kafka中的数据以及删除topic
  • CSS实现实现当文本内容过长时,中间显示省略号...,两端正常展示
  • go语言示例代码
  • Sourcetree登录GitLab账号
  • 如何确保Java爬虫程序的稳定性和安全性?
  • cesium 地图 事件触发
  • OPC UA 服务器
  • jd-easyflow中inclusive的用法
  • C++基础入门篇
  • Dowex 50WX8 ion-exchange resin可以用于去除水中的金属离子(如钠、钾、镁、钙等)和其他杂质,提高水质,11119-67-8
  • ubuntu没有了有线网络如何修复
  • 15. 函数参数传递机制
  • syslog udp配置笔记
  • centos7.4+ 卸载jdk8 mysql5.7 安装openjdk11 mysql8
  • 白光干涉仪助力手机玻璃盖板品质提升
  • 基于MATLAB的相机内参标定及其原理——附实现教程
  • 【C++】栈、队列、双端队列与优先级队列
  • Nginx: 实现Websocket代理
  • python基础知识(七)——写入excel
  • Python | Leetcode Python题解之第564题数组嵌套
  • vue3 element el-table实现表格动态增加/删除/编辑表格行,带有校验规则
  • 吉林大学 超星慕课 高级语言程序设计 学习通部分题目极其答案
  • docker学习笔记跟常用命令总结
  • Docker和VMWare有什么不同