vue模拟聊天页面列表:滚动到底部,滚动到顶部触发加载更多

先看下效果:

在这里插入图片描述

代码:

<template>
  <div>
    <div style="text-align: center">
      <button @click="scrollTop">滚动到顶部</button>
      <button @click="scrollBottom">滚动到底部</button>
    </div>

    <div class="scroll_wrap" ref="scrollWrap">
      <div v-for="(s, i) in list" :key="i" class="item">{{ s }}</div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [],
      noMore: false, //暂无更多数据
    };
  },
  mounted() {
    this.initData();
    this.scrollBottom();
    this.$refs.scrollWrap.addEventListener("scroll", this.onScrollListener);
  },
  methods: {
    //滚动监听
    onScrollListener() {
      if (this.$refs.scrollWrap.scrollTop == 0) {
        console.log("滚动到顶部了");
        
        if (this.noMore) {
          this.$baseUI.showToast("暂无更多数据");
          return;
        }

        this.$baseUI.showLoading();
        
        //模拟耗时任务从接口获取数据
        setTimeout(() => {
          const scrollWrap = this.$refs.scrollWrap;

          let h1 = scrollWrap.scrollHeight;
          console.log("h1======" + h1);

          this.loadMoreData();
          this.$baseUI.hideLoading();

          //list更新后,等待页面渲染完毕再去拿scrollHeight,否则拿到的是之前的
          this.$nextTick(() => {
            let h2 = scrollWrap.scrollHeight;
            console.log("h======" + h2);
			
			//顶部在原先基础上往下滚动50px,露出新加载数据的一点	
            scrollWrap.scrollTo({
              top: h2 - h1 - 50,
              behavior: "instant", //auto-自动滚动 instant-瞬间滚动 smooth-平滑滚动
            });
          });
        }, 1000);
      }
    },
    //滚动到顶部
    scrollTop() {
      this.$nextTick(() => {
        const scrollWrap = this.$refs.scrollWrap;
        scrollWrap.scrollTo({
          top: 0,
          behavior: "smooth", //auto-自动滚动 instant-瞬间滚动 smooth-平滑滚动
        });
      });
    },
    //滚动到底部
    scrollBottom() {
      this.$nextTick(() => {
        let scrollWrap = this.$refs.scrollWrap;
        scrollWrap.scrollTo({
          top: scrollWrap.scrollHeight,
          behavior: "smooth", //auto-自动滚动 instant-瞬间滚动 smooth-平滑滚动
        });
      });
    },
    //加载更多数据
    loadMoreData() {
      let arr = [];
      for (let i = this.list.length; i < 10 + this.list.length; i++) {
        arr.unshift("data --- " + i);
      }
      this.list = [...arr, ...this.list];

      if (this.list.length == 40) {
        this.noMore = true; //数据全部加载完毕
      }
    },
    //初始化数据
    initData() {
      for (let i = 0; i < 20; i++) {
        this.list.unshift("data --- " + i);
      }
    },
  },
  beforeDestroy() {
    this.$refs.scrollWrap.removeEventListener("scroll", this.onScrollListener);
  },
};
</script>

<style lang="less" scoped>
.scroll_wrap {
  width: 300px;
  height: 500px;
  position: absolute;
  top: 30px;
  left: 50%;
  transform: translateX(-50%);
  border: 1px solid #333;
  overflow: auto;

  .item {
    height: 50px;
    line-height: 50px;
    padding-left: 15px;
    border-bottom: 1px solid #e4e4e4;
  }
}
</style>

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

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

相关文章

GitHub Copilot 与 ChatGPT:哪种工具更适合软件开发?

GitHub Copilot 与 ChatGPT&#xff1a;哪种工具更适合软件开发&#xff1f; 比较 ChatGPT 与 GitHub Copilot编程语言功能性定制化训练数据上下文准确性 ChatGPT 与 GitHub Copilot&#xff1a;哪个更适合软件开发&#xff1f;常见问题解答&#xff1a; 不断发展的编程世界正在…

基数排序算法

1. 排序算法分类 十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a; 通过比较来决定元素间的相对次序&#xff0c;由于其时间复杂度不能突破O(nlogn)&#xff0c;因此也称为非线性时间比较类排序。比较类排序算法包括&#xff1a;插入排序、希尔排序、选择…

matlab绘图杂谈-stem函数和plot函数

出发点 今天在论文中看到一副这样的图&#xff0c;它既有曲线&#xff0c;又有点&#xff0c;并且对两者都添加了图例。三条曲线应该是用plot函数绘制的&#xff0c;而target哪个绿色的圆圈&#xff0c;我的理解是用stem函数绘制的。它只是1个点&#xff0c;并且没有竖线&…

Ps:可选颜色

可选颜色 Selective Color命令可以按指定的颜色&#xff08;范围&#xff09;进行单独的调整&#xff0c;且不会影响图像中的其他颜色。 Ps菜单&#xff1a;图像/调整/可选颜色 Adjustments/Selective Color Ps菜单&#xff1a;图层/新建调整图层/可选颜色 New Adjustment Laye…

Qt 基于海康相机 的视频标绘

需求&#xff1a; 基于 视频 进行 标注&#xff0c;从而进行测量。 曾经搞在线教育时&#xff0c;尝试在视频上进行文字或者图形的绘制&#xff0c;但是发现利用Qt widget 传sdk 句柄的方式&#xff0c;只能使用窗口叠加的方式&#xff08;Qt 基于海康相机的视频绘图_海康相…

【WPF.NET开发】WPF 中的 Layout

本文内容 元素边界框布局系统测量和排列子元素面板元素和自定义布局行为布局性能注意事项子像素渲染和布局舍入 本主题介绍 Windows Presentation Foundation (WPF) 布局系统。 了解布局计算发生的方式和时间对于在 WPF 中创建用户界面非常重要。 1、元素边界框 在 WPF 中构…

React中使用LazyBuilder实现页面懒加载方法一

前言&#xff1a; 在一个表格中&#xff0c;需要展示100条数据&#xff0c;当每条数据里面需要承载的内容很多&#xff0c;需要渲染的元素也很多的时候&#xff0c;容易造成页面加载的速度很慢&#xff0c;不能给用户提供很好的体验时&#xff0c;懒加载是优化页面加载速度的方…

算法基础之树状数组

文章目录 树状数组 树状数组 树状数组能解决的最关键的问题就是能够 O ( log ⁡ n ) O(\log n) O(logn)内&#xff0c;给某个位置上的数&#xff0c;加上一个数&#xff0c;或者求前缀和 他和前缀和数组的区别就是&#xff0c;树状数组支持修改原数组的内容&#xff0c;而前缀…

前端学习之——react篇(渲染列表)

你将依赖 JavaScript 的特性&#xff0c;例如 for 循环 和 array 的 map() 函数 来渲染组件列表。 假设你有一个产品数组&#xff1a; const products [{ title: Cabbage, id: 1 },{ title: Garlic, id: 2 },{ title: Apple, id: 3 }, ]; 在你的组件中&#xff0c;使用 map…

视频尺寸魔方:分层遮掩3D扩散模型在视频尺寸延展的应用

▐ 摘要 视频延展(Video Outpainting)是对视频的边界进行扩展的任务。与图像延展不同&#xff0c;视频延展需要考虑到填充区域的时序一致性&#xff0c;这使得问题更具挑战性。在本文中&#xff0c;我们介绍了一个新颖的基于扩散模型的视频尺寸延展方法——分层遮掩3D扩散模型(…

linux conda 配置 stable video diffusion

安装教程 1 下载仓库源码 git clone https://github.com/Stability-AI/generative-models.git2 创建conda环境 conda create -n svd python3.10 conda activate svd3 安装pytorch gpu cuda和cudnn请参考其他链接配置&#xff0c;使用 conda 或者 pip 安装 pytorch # 使用c…

Linux 驱动开发基础知识——编写LED驱动程序(三)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

Vue开发之proxy代理的配置(附带uniapp代理配置)

vue 1.在vue.config.js中添加 devServer 属性中配置 proxy 属性 module.exports {productionSourceMap: false,publicPath: /,devServer: {port: 8085,proxy: {/api/admin: {target: http://10.58.104.70:6111,changeOrigin: true,pathRewrite: {/api/: /}},/api: {target: …

NIO-Channel详解

NIO-Channel详解 1.Channel概述 Channel即通道&#xff0c;表示打开IO设备的连接&#xff0c;⽐如打开到⽂件、Socket套接字的连接。在使⽤NIO时&#xff0c;必须要获取⽤于连接IO设备的通道以及⽤于容纳数据的缓冲区。通过操作缓冲区&#xff0c;实现对数据的处理。也就是说…

从源头到成品:精酿啤酒原料的完整追踪

对于追求品质的Fendi Club啤酒来说&#xff0c;从源头到成品的完整原料追踪是确保其品质的关键。这种追踪不仅涉及原料的采购&#xff0c;还包括其在生产过程中的处理和产品的质量控制。下面&#xff0c;我们将详细探讨Fendi Club啤酒如何实现从源头到成品的完整原料追踪。 首先…

安全用电管理平台方案介绍——Acrelcloud-6000

安全用电管理平台是一个针对电力系统安全管理的平台&#xff0c;旨在提供对电力设备和用电行为进行监控、分析和管理的解决方案。该平台结合了物联网技术、数据分析和远程监控等技术手段&#xff0c;能够实时监测、分析和预警电力系统的安全状况&#xff0c;以便及时采取措施防…

电气火灾监控探测器的种类有哪些?

随着电力行业的快速发展&#xff0c;电气火灾的威胁也越来越突出。为了有效预防和及时发现电气火灾&#xff0c;电气火灾探测器成为了不可或缺的重要设备。本文将详细介绍电气火灾探测器的定义、工作原理、应用场景以及安装和维护方法&#xff0c;旨在帮助大家更好地了解和使用…

爬取第一试卷网高三数学试卷并下载到本地

import requests import re import os filename 试卷\\ if not os.path.exists(filename):os.mkdir(filename) url https://www.shijuan1.com/a/sjsxg3/list_727_1.html headers {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.…

Android消息推送 SSE(Server-Sent Events)方案实践

转载请注明出处&#xff1a;https://blog.csdn.net/kong_gu_you_lan/article/details/135777170 本文出自 容华谢后的博客 0.写在前面 最近公司项目用到了消息推送功能&#xff0c;在技术选型的时候想要找一个轻量级的方案&#xff0c;偶然看到一篇文章讲ChatGPT的对话机制是基…

[蓝桥杯]真题讲解:冶炼金属(暴力+二分)

蓝桥杯真题视频讲解&#xff1a;冶炼金属&#xff08;暴力做法与二分做法&#xff09; 一、视频讲解二、暴力代码三、正解代码 一、视频讲解 视频讲解 二、暴力代码 //暴力代码 #include<bits/stdc.h> #define endl \n #define deb(x) cout << #x << &qu…
最新文章