前端开发攻略---模拟后端接口返回数据,教你三种方式实现滚动到底部加载更多数据

1、演示

 2、方式一:手动监听滚动事件

原理:

手动监听滚动事件的原理是通过添加滚动事件监听器,当页面滚动时触发相应的回调函数,检测页面是否已经滚动到底部,从而触发加载更多数据的逻辑。

优点:

1、相对简单直接:不需要引入额外的插件或API,只需编写少量代码即可实现滚动加载更多功能。

2、可定制性强:可以根据项目需求灵活地调整滚动加载更多的逻辑,比如添加动画效果、加载提示等。

缺点:

1、性能问题:由于滚动事件触发频率较高,在数据量较大时可能会导致性能问题,需要额外的优化措施来提高性能。

2、兼容性问题:不同浏览器的滚动事件表现可能不尽相同,需要考虑浏览器兼容性。

3、实现复杂度:相比起使用现成的插件或API,手动监听滚动事件需要编写更多的代码。

实现代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      .loadingText {
        width: 100%;
        text-align: center;
        height: 50px;
        font-size: 50px;
        align-items: center;
      }
      .item {
        font-size: 50px;
        padding: 50px;
        width: 100%;
        background-color: rgb(71, 70, 70);
        text-align: center;
        margin-bottom: 10px;
      }
    </style>
  </head>
  <body>
    <div class="container"></div>
    <p class="loadingText">正在加载...</p>
  </body>
  <script>
    const container = document.querySelector('.container')
    const loadingText = document.querySelector('.loadingText')

    const body = {
      pageSize: 10,
      pageNum: 1,
    }
    let data = []
    const total = 25
    function getData() {
      let maxNum = body.pageNum * body.pageSize
      let startNum = (body.pageNum - 1) * body.pageSize + 1
      let endNum = maxNum > total ? total : maxNum
      for (let i = startNum; i <= endNum; i++) {
        data.push(i)
      }
      renderPage()
    }

    function renderPage() {
      container.innerHTML = ''
      for (let i = 0; i < data.length; i++) {
        const div = document.createElement('div')
        div.innerText = data[i]
        div.classList = 'item'
        container.appendChild(div)
      }
    }

    let timer = null
    document.addEventListener('scroll', function (e) {
      if (timer) clearTimeout(timer)
      timer = setTimeout(() => {
        var contentHeight = document.documentElement.scrollHeight || document.body.scrollHeight
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop
        var windowHeight = document.documentElement.clientHeight || document.body.clientHeight
        if (contentHeight - scrollTop - windowHeight <= 0) {
          if (body.pageNum >= Math.ceil(total / body.pageSize)) {
            loadingText.innerHTML = '没有更多了'
            return
          } else {
            body.pageNum++
            getData()
          }
        }
      })
    })

    window.onload = function () {
      getData()
    }
  </script>
</html>

代码解析:

1、定义body模拟后端所需参数,pageSize表示一次加载多少条数据,pageNum表示第几次加载数据

2、定义data数据

3、定义total模拟通过调用接口后端返回的数据总条数

4、getData函数模拟从后端获取数据

5、renderPage函数用来将数据渲染到页面上

最后通过监听页面的滚动事件,当用户滚动页面时,会触发该事件。在事件处理函数中,首先会清除之前设置的定时器timer,然后再设置一个新的定时器。这样做是为了防止在用户不断滚动页面时频繁触发事件处理函数。

在定时器中,首先获取页面内容的高度、滚动距离和窗口高度。然后判断用户是否已经滚动到页面底部,即页面内容高度减去滚动距离和窗口高度的差值是否小于等于0。如果是,则判断当前页面页数是否已经达到总页数,如果是,则显示"没有更多了"的提示信息,否则增加页数并继续获取数据。

3、 方式二:使用原生的Intersection Observer API

原理:

通过监视指定元素与视口交叉的情况,当指定元素进入或离开视口时触发相应的回调函数。通过使用Intersection Observer API,可以实现监听滚动事件,从而触发加载更多数据的功能。

优点:

1、高性能:Intersection Observer API可以节省性能资源,因为它只在元素进入或离开视口时触发相关回调函数,相比手动监听滚动事件性能更好。

2、良好的浏览器支持:Intersection Observer API的浏览器支持较好,可以在大多数主流浏览器中使用。

3、灵活性:可以通过配置选项灵活地调整触发时机和回调函数,满足不同项目需求。

缺点:

1、相对复杂:相比手动监听滚动事件,使用Intersection Observer API需要理解一定的API和相关概念,相对复杂一些。

2、兼容性问题:虽然大多数主流浏览器支持Intersection Observer API,但仍有部分浏览器可能存在兼容性问题,需要进行兼容性处理。

实现代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      .loadingText {
        width: 100%;
        text-align: center;
        height: 50px;
        font-size: 50px;
        align-items: center;
      }
    </style>
  </head>
  <body>
    <div class="container"></div>
    <p class="loadingText">正在加载...</p>
  </body>
  <script>
    const container = document.querySelector('.container')
    const loadingText = document.querySelector('.loadingText')

    const body = {
      pageSize: 10,
      pageNum: 1,
    }
    let data = []
    const total = 25
    function getImgData() {
      let maxNum = body.pageNum * body.pageSize
      let startNum = (body.pageNum - 1) * body.pageSize + 1
      let endNum = maxNum > total ? total : maxNum
      for (let i = startNum; i <= endNum; i++) {
        data.push(`https://img.beiqiai.com/img${i}.jpg`)
      }
      renderPage()
    }

    function renderPage() {
      container.innerHTML = ''
      for (let i = 0; i < data.length; i++) {
        const img = document.createElement('img')
        img.src = data[i]
        container.appendChild(img)
      }
    }

    const observer = new IntersectionObserver(entries => {
      // 遍历观察到的所有元素
      entries.forEach(entry => {
        // 如果当前元素进入视口
        if (entry.isIntersecting) {
          if (body.pageNum > Math.ceil(total / body.pageSize)) {
            loadingText.innerHTML = '没有更多了'
            observer.unobserve(loadingText)
            return
          } else {
            getImgData()
            body.pageNum++
          }
        }
      })
    })

    observer.observe(loadingText)
  </script>
</html>

代码解析:

总体思路不变,将方式一种的监听滚动事件换成使用IntersectionObserver来进行监听

在这里使用IntersectionObserver创建了一个观察器实例,并使用它来观察具有id "loadingText"的元素。当被观察的元素进入视口时,代码会检查当前页面数是否超过基于总项目数和页面大小计算得出的总页数。如果是这样,它会更新加载文本以指示没有更多项目可以加载,并停止观察该元素。否则,它调用getImgData()函数加载更多图像数据,并递增页面数。

4、方式三:使用插件 

原理:

使用Element组件库中的Infinite Scroll 无限滚动插件。

优点:

1、快速实现:使用无限滚动插件可以快速实现滚动加载更多功能,节省开发时间和精力。

2、配置灵活:插件提供了丰富的配置选项,可以根据项目需求灵活定制加载更多数据的行为。

3、通用性:无限滚动插件通常具有良好的通用性,可以在多个项目中复用。

缺点:

1、依赖第三方插件:使用无限滚动插件需要依赖第三方库或插件,可能会增加项目的复杂度。

2、定制性受限:虽然插件提供了丰富的配置选项,但某些特定的定制需求可能无法通过插件满足,需要额外的工作。

3、性能问题:一些无限滚动插件可能存在性能问题,特别是在处理大量数据时,需要进行优化。

实现代码:

<template>
  <ul v-infinite-scroll="load" class="infinite-list" style="overflow: auto">
    <li v-for="i in count" :key="i" class="infinite-list-item">{{ i }}</li>
  </ul>
</template>

<script lang="ts" setup>
import { ref } from 'vue'
const count = ref(0)
const load = () => {
  count.value += 2
}
</script>

<style>
.infinite-list {
  height: 300px;
  padding: 0;
  margin: 0;
  list-style: none;
}
.infinite-list .infinite-list-item {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 50px;
  background: var(--el-color-primary-light-9);
  margin: 10px;
  color: var(--el-color-primary);
}
.infinite-list .infinite-list-item + .list-item {
  margin-top: 10px;
}
</style>

代码解析:

通过使用v-infinite-scroll指令,当滚动到列表底部时调用load方法来加载更多数据。初始时列表为空,通过循环遍历count来显示对应数量的列表项。每次调用load方法时,count增加2,从而增加2个列表项。

在样式部分,.infinite-list设置了高度和样式,在.infinite-list .infinite-list-item中设置了每个列表项的样式,包括高度、背景色、边距和文字颜色。.infinite-list .infinite-list-item + .list-item用来给列表项之间添加间距。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/581112.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

理解ROS2的动作

​ 1. 创建一个动作 目标&#xff1a; 在ROS 2软件包中定义一个动作。 1.1 新建包 设置一个 workspace 并创建一个名为 action_tutorials_interfaces 的包&#xff1a; mkdir -p ros2_ws/src #you can reuse existing workspace with this naming convention cd ros2_ws/s…

HTTPS证书申请:相关流程及注意事项

HTTPS证书&#xff08;即HTTPS证书、服务器证书&#xff09;是实现网络通信安全的重要技术产品&#xff0c;它为网站提供HTTPS加密和服务器身份验证的功能。HTTPS证书申请有那些流程&#xff1f;如何快速完成HTTPS证书申请&#xff1f;有哪些注意事项&#xff1f;本文将以沃通H…

Meta Llama 3 性能提升与推理服务部署

利用 NVIDIA TensorRT-LLM 和 NVIDIA Triton 推理服务器提升 Meta Llama 3 性能 我们很高兴地宣布 NVIDIA TensorRT-LLM 支持 Meta Llama 3 系列模型&#xff0c;从而加速和优化您的 LLM 推理性能。 您可以通过浏览器用户界面立即试用 Llama 3 8B 和 Llama 3 70B&#xff08;该…

Android优化RecyclerView图片展示:Glide成堆加载批量Bitmap在RecyclerView成片绘制Canvas,Kotlin(b)

Android优化RecyclerView图片展示&#xff1a;Glide成堆加载批量Bitmap在RecyclerView成片绘制Canvas&#xff0c;Kotlin&#xff08;b&#xff09; 对 Android GridLayoutManager Glide批量加载Bitmap绘制Canvas画在RecyclerView&#xff0c;Kotlin&#xff08;a&#xff09;-…

【哔哩哔哩笔试题汇总】2024-04-28-哔哩哔哩春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新b站近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497…

基于Hadoop的网上购物行为分析设计与实现

2.8 数据分析及可视化 2.8.1 店铺销售情况分析 通过这里可以看出&#xff0c;该店家的数据用户访问量比较的大&#xff0c;有接近6W多条数据&#xff0c;但是通过对用户进行透视分析发现只有981位用户&#xff0c;其次就是对于用户购买次数进行分析&#xff0c;发现数据只有27…

2017年全国职业院校技能大赛高职组“信息安全管理与评估”样题

培训、环境、资料、考证 公众号&#xff1a;Geek极安云科 网络安全群&#xff1a;624032112 网络系统管理群&#xff1a;223627079 网络建设与运维群&#xff1a;870959784 移动应用开发群&#xff1a;548238632 极安云科专注于技能提升&#xff0c;赋能 2024年广东省高校的技…

2.Neo4j的搭建启动

Graph Database 图数据库 版本对应关系 官网都是高版本&#xff0c;推荐使用下载地址可以找到社区老版本&#xff1a; https://we-yun.com/doc/neo4j/ neo4j.bat 启动脚本 cypher-shell.bat 执行CQL语句的。 import文件夹可以放入excel,csv等数据文件&#xff0c;导入到…

Transformer - Layer Normalization

Transformer - Layer Normalization flyfish y x − E [ x ] V a r [ x ] ϵ ∗ γ β y \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] \epsilon}} * \gamma \beta yVar[x]ϵ ​x−E[x]​∗γβ 论文 Layer Normalization import numpy as np import torch import…

交直流充电桩检测的基础知识

交直流充电桩检测是电动汽车充电设施的重要组成部分&#xff0c;其目的是确保充电桩的正常运行&#xff0c;保障电动汽车的安全充电。以下是关于交直流充电桩检测的一些基础知识。 我们需要了解什么是交直流充电桩&#xff0c;简单来说&#xff0c;交直流充电桩是一种为电动汽车…

Centos7 RPM包离线安装Nginx

查看是否安装nginx #使用命令 rpm -qa|grep 列出需要卸载的软件包 rpm -qa | grep nginx 卸载nginx #使用rpm -e 加包名删除 rpm -e nginx-release-centos-7-0.el7.ngx.noarch nginx-1.14.1-1.el7_4.ngx.x86_64 rpm -e nginx 安装nginx 其他版本步骤一样 下载rpm包In…

BTCOIN的革命之路:通过SocialFi重塑全球金融生态系统

BTCOIN的革命之路&#xff1a;通过SocialFi重塑全球金融生态系统 今日&#xff0c;BTCOIN宣布发布WEB3.0论坛引发业内现象级关注&#xff1a;作为一个倡导WEB3.0理念的数字金融平台&#xff0c;在数字货币的波澜壮阔中&#xff0c;BTCOIN以其独特的生态定位和战略愿景&#xff…

进程控制7 - exec函数族

区别1 &#xff1a;参数1—>可执行文件名 区别2 &#xff1a;参数表的传递 区别3 &#xff1a;环境表的传递 详细举例说明&#xff1a; 下面这个demo使用execl函数&#xff0c;传入path也就是execlnewpro的路径&#xff08;这里也可以写绝对路径&#xff09;&#xff0c;…

线上社交app的搭建,圈子社交系统,小程序+app+H5三端,源码交付,支持二开!

在科技飞速发展的大背景下&#xff0c;年轻人社交不再局限于面对面&#xff0c;线上社交app已深入各大年轻人的手机中。相比于传统交友方式&#xff0c;线上社交app为用户提供了更加新奇的交友体验。同时&#xff0c;它还可以吸引更多的朋友&#xff0c;提高用户的整体交友体验…

Python 操作PDF图片 – 添加、替换、删除PDF中的图片

PDF文件中的图片可以丰富文档内容&#xff0c;提升用户的阅读体验。除了在PDF中添加图片外&#xff0c;有时也需要替换或删除其中的图片&#xff0c;以改进视觉效果或更新信息。文本将提供以下三个示例&#xff0c;介绍如何使用Python 操作PDF文件中的图片&#xff1a; 目录 …

python_django农产品物流信息服务系统6m344

Python 中存在众多的 Web 开发框架&#xff1a;Flask、Django、Tornado、Webpy、Web2py、Bottle、Pyramid、Zope2 等。近几年较为流行的&#xff0c;大概也就是 Flask 和 Django 了 Flask 是一个轻量级的 Web 框架&#xff0c;使用 Python 语言编写&#xff0c;较其他同类型框…

C++智能指针详解

目录 一. 智能指针初识 1.1 什么是智能指针 1.2 智能指针历史历程 1.3 为什么需要智能指针 1.3.1 内存泄漏 1.3.2 防止内存泄漏 1.3.3 异常的重新捕获 二. 智能指针的原理与使用 2.1 智能指针的原理 2.2 智能指针的使用 2.3 智能指针的拷贝问题…

视频抽帧转图片,opencv和ffmpeg效果测评

最近在做一个项目&#xff0c;需要从视频中抽帧转图片&#xff0c;于是对opencv和ffmpeg效果进行了测评。 文章目录 1. open cv2. ffmpeg3.抽帧效果对比 1. open cv open cv 视频抽图片的教程&#xff0c;推荐以下链接&#xff0c;抽的帧数可以自行调节&#xff01; 用pythono…

CSS伪类大全!4大类伪类详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

[C++基础学习]----01-C++数据类型详解

前言 C是一种静态类型的编程语言&#xff0c;它提供了丰富的数据类型来存储和操作数据。这些数据类型为C程序员提供了丰富的选择&#xff0c;可以根据具体需求来选择最合适的类型来存储和操作数据。下面详细解释一些常见的C数据类型&#xff0c;包括其原理和使用方法&#xff1…
最新文章