Vue3实现滚动到容器底部时发送请求,加载新数据

问题来源

在项目中出现了需要在容器滚动到底部时,加载新的数据的需求,以下是解决的方案笔记

解决

画了个流程图:

如图,先添加一个动态加载的图标,还有全部数据载完的《到底啦...》

大概这么个样子,之后呢,我们需要用到@scroll方法和ref获取这个元素的scrollHeight 和scrollTop来机型判断加不加载数据,再使用上面说到的节流操作,就成功实现啦..代码如下,需要根据业务对应的请求...


// 节流, 是在重复的事件请求中,只执行一次

// eslint-disable-next-line @typescript-eslint/ban-types
export const throttle = (fn: any, delay: number): Function => {
  let throttleTimer: NodeJS.Timeout | null;
  return (...args: unknown[]) => {
    if (throttleTimer) {
      return;
    }
    throttleTimer = setTimeout(() => {
      fn.apply(this, args);
      throttleTimer = null;
    }, delay);
  };
};


let loadMoreThrottle = throttle(loadMore, 500);

const getData = () => {
  //获取新的数据
  const container: any = messageContainer.value;
 // 如果到底了,并且数据还未加载完
  if (
    container.scrollTop + container.clientHeight >= container.scrollHeight &&
    !down.value
  ) {
    console.log("到底了");
    loading.value = true;
    loadMoreThrottle();
  }
};


const loadMore = async () => {
  // 如果已经加载完了,无需加载新数据
  if (down.value) {
    return;
  }
  // 加载需要房前页数+1
  current.value++;
  // 根据业务设置请求参数啥的
  const commentQuery = {
    questionId: props.questionId,
    current: current.value,
    pageSize: 10,
  } as CommentQueryRequest;
  const res = await CommentControllerService.listCommentByPageUsingPost(
    commentQuery
  );
  if (res.code === 0) {
    //载入新数据
    allmessages.value.push(...(res.data.records));
    if (res.data.pages === res.data.current) {
      down.value = true;
    }
  } else {
    message.error("请求失败:" + res.message);
  }
  // 最后把加载中设置为false
  loading.value = false;
};

 同理,也可以用监听去做。

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

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

相关文章

苍穹外卖——地址簿功能

地址簿功能代码 1. 地址簿功能 1.1 需求分析和设计 查询地址列表新增地址修改地址删除地址设置默认地址查询默认地址 1.1.1 接口设计 根据上述原型图先粗粒度设计接口,共包含7个接口。 接口设计: 新增地址查询登录用户所有地址查询默认地址根据id…

C++基础 -35- string类

string类的格式 string a;如下图,使用string类比常规的字符串处理方便很多 而且需要进行的字符串处理,在类中都能完成 #include "iostream"using namespace std;extern "C" {#include "string.h" }int main() {//c的写…

SpringBoot框架结合Redis实现分布式锁

一、SpringBoot结合 Redis实现分布式锁 1.1、什么是分布式锁 分布式锁,是在分布式的环境下,才会使用到的一种同步访问机制,在传统的单体环境里面,不存在分布式锁的概念,只有在分布式环境里面,才有分布式锁…

【Python】tensorflow学习的个人纪录(3)

sess tf.Session()actor Actor(sess, n_featuresN_S, lrLR_A, action_bound[-A_BOUND, A_BOUND])步进:

工具网站:随机生成图片的网站

一个随机生成图片的网站:Lorem Picsum。 有时候,我们做静态页面需要大量图片去填充内容,以使用该网站去生成指定尺寸的图片。每次打开页面都会获取不同的图片,就不用我们做静态页面开发的时候,绞尽脑汁去找图片了。 …

【滑动窗口】水果成篮

水果成篮 904. 水果成篮 - 力扣(LeetCode) 文章目录 水果成篮题目描述问题转化 算法原理解法一解法二 代码编写C代码:使用容器数组模拟哈希表 Java代码使用容器数组模拟哈希表 题目描述 你正在探访一家农场,农场从左到右种植了一…

【hacker送书活动第7期】Python网络爬虫入门到实战

第7期图书推荐 内容简介作者简介大咖推荐图书目录概述参与方式 内容简介 本书介绍了Python3网络爬虫的常见技术。首先介绍了网页的基础知识,然后介绍了urllib、Requests请求库以及XPath、Beautiful Soup等解析库,接着介绍了selenium对动态网站的爬取和S…

红队攻防实战之Access注入

若盛世将倾,深渊在侧,我辈当万死以赴 访问漏洞url: 1.Access联合查询 判断是否有注入 and 11正常,and 12出错 判断字段数 order by 7正常 order by 8出错 爆破出表名并判断回显点为2,5 查看字段内容,将字段名填入回…

37. 解数独

题目描述 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) …

思维模型 反馈效应

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。反馈促进改进。 1 反馈效应的应用 1.1 反馈效应在营销中的应用 1 “可口可乐与百事可乐之战” 在 20 世纪 80 年代,可口可乐公司是全球最大的饮料公司之一,其市场…

常见的线程安全问题及解决

1. 什么是线程安全 线程安全指的是当多个线程同时访问一个共享的资源时,不会出现不确定的结果。这意味着无论并发线程的调度顺序如何,程序都能够按照设计的预期来运行,而不会产生竞态条件(race condition)或其他并发问…

算法设计与实现--贪心篇

贪心算法 贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法,以期望能够通过一系列局部最优的选择达到全局最优。贪心算法的关键是定义好局部最优的选择,并且不回退,即一旦做出了选择,就不能撤销。 一般来说&#xf…

洛谷 P5711 闰年判断 C++代码

目录 前言 思路点拨 AC代码 结尾 前言 今天我们来做洛谷上的一道题目。 网址:【深基3.例3】闰年判断 - 洛谷 题目: 思路点拨 首先题目让我们输入一个年份,因此我们需要定义一个变量year,来存储输入的年份: in…

Bean的加载控制

Bean的加载控制 文章目录 Bean的加载控制编程式注解式ConditionalOn*** 编程式 public class MyImportSelector implements ImportSelector {Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {try {Class<?> clazz Class.forName("…

Nginx 具体应用

1 Nginx 1.1 介绍 一款轻量级的 Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。它占有的内存少&#xff0c;并发能力强&#xff0c;中国大陆使用 nginx 的网站有&#xff1a;百度、京东、新浪、网易、腾讯、淘宝等。第一个公开版本发布于…

Flyway 数据库版本管理 | 专业解决方案

前言 目前很多公司都是通过人工去维护、同步数据库脚本&#xff0c;但经常会遇到疏忽而遗漏的情况&#xff0c;同时也是非常费力耗时 比如说我们在开发环境对某个表新增了一个字段&#xff0c;而提交测试时却忘了提交该 SQL 脚本&#xff0c;导致出现 bug 而测试中断&#xf…

vs 安装 qt qt扩展 改迅雷下载qt

Qt5.14.2安装教程和VS2019中的qt环境配置-CSDN博客 1 安装qt 社区版 免费 Download Qt OSS: Get Qt Online Installer 2 vs安装 qt vs tools 3 vs添加 qt添加 bin/cmake.exe 路径 3.1 扩展 -> qt versions 3.2 4 新版要源码安装 需要自己安装 安装独立安装的旧版 官网…

go自定义端口监听停用-------解决端口被占用的问题

代码 package mainimport ("fmt""log""net""os/exec""strconv""strings" )func getSelect(beign int, end int) int {var num intfor {_, err : fmt.Scan(&num)if err ! nil {fmt.Println("输入错误&am…

【c】角谷猜想

#include<stdio.h> int coll(int x)//定义函数 {int count0;while(x>1){if(x%20){xx/2;count;}else{x3*x1;count;}}return count; } int main() {int n,num;scanf("%d",&n);int arr[n1];for(int i1;i<n;i)//输入n组数据保存到数组中{scanf("%d&…

Python图表神器:Matplotlib库绘制图表轻松有趣

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Matplotlib是Python中用于绘制图表和数据可视化的重要库。它提供了丰富的功能和灵活性&#xff0c;可用于生成各种类型的图表&#xff0c;从简单的折线图到复杂的三维图表。 1. 基本图表绘制 折线图 Matplotl…