PC端查看历史消息,鼠标向上滚动加载数据时页面停留在上次查看的位置

在工作中,碰到PC端类似聊天框,鼠标向上滚动,触顶时分页获取数据;但是将接口获得的数据连接到循环数组数据前面时,由于数据变化,滚动条会直接滚动到最顶端,显然这个效果不友好。最好的效果就是,页面会停留在上次查看的位置。

目前问题是解决了,但是是以vue2的基础上解决的,但是vue3也是可以完全使用的。一开时写这个需求时,感觉我写的不太好,因为我把消息输入框和消息渲染框写成了两个子组件,而且项目还是vue3,显然加大了编写代码的难度。

组件通信太复杂的话,还是写在一个页面好;不然难度过于复杂。代码就在下面,相信可以为你所用

<template><div class="scroll-container" @wheel="handleScroll"><div v-for="(item, index) in items" :key="index" class="item">{{ item.num }}</div></div>
</template><script>
export default {data() {return {items: [{num: 1},{num: 2},{num: 3},{num: 4},{num: 5},{num: 6},{num: 7},], // 初始数据isLoading: false,lastScrollTop: 0, // 记录上次滚动位置};},methods: {handleScroll(event) {if (this.isLoading) return;const scrollDiv = document.getElementsByClassName('scroll-container')[0]const container = event.target;if (event.deltaY < 0) {console.log(container.scrollTop);if (scrollDiv.scrollTop == 0) {console.log('滚动');this.isLoading = truethis.loadMore();}}},loadMore() {// 模拟异步加载数据setTimeout(() => {this.items.unshift({num: '12'},{num: '13'},{num: '14'},{num: '15'},{num: '16'},{num: '17'},{num: '18'},{num: '19'},{num: '20'},);this.$nextTick(this.scrollToLastPosition); // 数据更新后滚动到上次位置this.isLoading = false;}, 1000);},scrollToLastPosition() {const container = document.getElementsByClassName('scroll-container')[0];const items = document.getElementsByClassName('item')container.scrollTop = items[10].offsetTop;}},
};
</script><style>
.scroll-container {width: 600px;height: 800px;/* 设置一个固定高度 */overflow-y: auto;position: relative;
}.item {width: 100%;height: 200px;border: 1px solid #ccc;/* 每个item的高度 */
}.loader {text-align: center;margin-top: 10px;
}
</style>

解决的关键

数据更新时后,要获取数据更新前,位于滚动条最顶端的元素距离父元素里偏移距离,当然父元素要设置相对定位,这样才能获取目标元素的的偏移量offsetTop,也就是父元素滚动条要滚动的距离。这里设置的是第十个元素的偏移量,这里可以设置为接口返回的数据的长度。再设置滚动的父元素的scrollTop为获取的元素偏移量就可以了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随着飞行汽车的亮相,在环保方面有什么保护措施吗

飞行汽车具备环保潜力&#xff0c;采用电动或混合动力系统减少污染&#xff0c;并拓展应用场景。多家企业布局&#xff0c;沃飞长空作为国内eVTOL(电动垂直起降航空器)研发的领先企业&#xff0c;在环保这一点做的非常到位&#xff0c;AE200采用纯电动力系统,零碳排放,静默飞行…

【Excel】常用公式记录

这里写自定义目录标题 根据身份证号获取年龄 根据身份证号获取年龄 替换公式中的 A2 TEXT(SUMPRODUCT(DATEDIF(TEXT(IF(LEN(A2)15,19,0)&MID(A2,7,LEN(A2)/2-1),“#0-00-00”),NOW(),{“y”,“ym”,“md”})*{10000,100,1}),“00岁零00个月零00天”)

LiveQing视频点播流媒体RTMP推流服务功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大

LiveQing视频点播流媒体RTMP推流服务功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大 1、鉴权直播2、视频点播3、RTMP推流视频直播和点播流媒体服务 1、鉴权直播 云直播服务-》鉴权直播 -》播放 &#xff0c;左键单击可以拉取矩形框&#xff0c;放大选中…

Android笔记(三十一):Deeplink失效问题

背景 通过deeplink启动应用之后&#xff0c;没关闭应用的情况下&#xff0c;再次使用deeplink会失效的问题&#xff0c;是系统bug导致的。此bug仅在某些设备&#xff08;Nexus 5X&#xff09;上重现&#xff0c;launchMode并且仅当应用程序最初通过深层链接启动并再次通过深层…

人工智能能改变哪些行业?深入分析应用场景与前景

人工智能&#xff08;AI&#xff09;技术的发展历程可追溯到20世纪50年代。最初&#xff0c;AI的概念是由计算机科学家阿兰图灵提出的&#xff0c;他设想了一种能够模拟人类思维的机器。随后&#xff0c;在1956年的达特茅斯会议上&#xff0c;人工智能作为一门独立学科正式诞生…

【缓存与加速技术实践】Redis数据类型

文章目录 Redis 数据类型String 数据类型List 数据类型Hash 数据类型Set 数据类型Sorted Set 数据类型 Redis 数据类型 Redis支持五种主要的数据类型&#xff1a; String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Hash&#xff08;散列&#xff09;…

【java】以<内存图>的形式理解数组的增删

数组 数组在内存里地址连续 定义一个数组&#xff0c;数组中的数据类型一样(二进制串位数相同)&#xff0c;故可以直接通过下标获取数组中的内容。 基本类型存的是值&#xff0c;引用类型存的是地址 数组的下标从0开始。 初始值&#xff1a; Int &#xff1a;0 char &am…

Swift 开发教程系列 - 第1章:Swift 简介与开发环境配置

在开始开发 Swift 应用之前&#xff0c;了解 Swift 语言的背景和设置开发环境非常重要。接下来&#xff0c;我们将逐步介绍 Swift 的基本概念&#xff0c;并带你完成开发环境的安装和项目创建。 1.1 Swift 简介 Swift 是由 Apple 开发的一种现代化编程语言&#xff0c;于 201…

时代变了!Megabit兆比特英伟达纳入道琼斯指数,英特尔被取代

△英特尔VS英伟达市值对比(截至今年2月) 最新消息,英伟达将在2024年11月8日替代英特尔成为道琼斯工业平均指数的组成成员。 Megabit兆比特自成立以来,Megabit凭借用户友好的界面和对透明度的承诺,迅速在加密货币市场中崭露头角,成为广大用户信赖的平台。 这是历史最悠久的美…

算法竞赛(Python)-大事化小,小事化了(分治)

文章目录 前言一、数乘型分治1 疯狂的细胞分裂 二 矩阵乘法的分治1 神秘数字 三 、线性结构问题的分治1 自助餐厅&#xff08;1&#xff09;2 自助餐厅&#xff08;2&#xff09; 四 、树形结构的分治1 二叉树的最大深度 前言 分治思想&#xff1a;将一个大问题分词几个小问题&…

React.js教程:从JSX到Redux的全面解析

文章目录 介绍react脚手架jsx语法和react组件jsx的基本语法jsx的行内样式jsx的类名classNameif条件渲染map循环渲染创建组件方法 可视区渲染 (React- virtualized)React-redux 介绍 javascript库&#xff0c;起源于Facebook的内部项目&#xff0c;类似于vue特点 声明式组件化 …

使用Jupyter Notebook进行数据科学项目

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jupyter Notebook进行数据科学项目 Jupyter Notebook 简介 安装 Jupyter Notebook 创建和管理 Notebook 编写和运行代码 示例…

在校大学生考了个PMP证书

作为一个大学生&#xff0c;大学生活其实还是蛮充实的&#xff0c;尤其是现在大环境不好&#xff0c;很多同学都会趁着在校期间多考几个证书&#xff0c;多去大厂实习攒经验啥的&#xff0c;我也不例外。 偶然了解到PMP这个证书跟我毕业之后的工作有关系&#xff0c;这不&…

21、基于AT89C52的电子密码锁proteus仿真设计

一、仿真原理图: 二、仿真效果: 三、相关代码: 1、定时中断: void Time0(void ) interrupt 1 using 1 { count++; if(count == 50) { count = 0; buffer = keyScan(); if(buffer < 16) { value[index++…

【HarmonyOS】鸿蒙应用设置控件通用样式AttributeModifier, @Styles

【HarmonyOS】鸿蒙应用设置控件通用样式AttributeModifier&#xff0c; Styles 前言 在鸿蒙中UI开发经常需要对控件样式进行统一的封装&#xff0c;在API早前版本&#xff0c;一般是通过 Styles进行样式封装复用&#xff1a; Entry Component struct Index {build() {Column(…

【MySQL】可重复读级别下基于Next Key Lock解决幻读

昨天读到了一篇文章[1]&#xff0c;里面讲&#xff0c;面试官说mysql的可重复读级别下有解决幻读的方式&#xff0c;最后公布了答案&#xff0c;是在sql后面加for update。这么说倒是没错&#xff0c;但是这种问法给我一种奇怪的感觉&#xff0c;因为for update无论在哪个隔离级…

vite项目弹窗,抽屉,上传图片,富文本框

一、调整目录 删除一些初始化的默认文件 删除剩余代码内容&#xff0c; 新增调整需要的目录结构&#xff08;utils,api,stores,views,router&#xff09; 拷贝全局样式和图片&#xff0c;安装预处理器支持 二、路由初始化 1.创建路由实例由createRouter实现 2.路由模式&…

Mybatis学习笔记(三)

十、MyBatis的逆向工程 (一)逆向工程介绍 MyBatis的一个主要的特点就是需要程序员自己编写sql&#xff0c;那么如果表太多的话&#xff0c;难免会很麻烦&#xff0c;所以mybatis官方提供了一个逆向工程&#xff0c;可以针对单表自动生成mybatis执行所需要的代码&#xff08;包…

dns构建

&#xff08;1&#xff09;用户输入域名发起域名查询请求。 &#xff08;2&#xff09;计算机操作系统先查找本地hosts文件中是否有这个域名与IP的对应关系&#xff0c;有就返回结果给用户&#xff0c;没有就进入下一步。 &#xff08;3&#xff09;hosts文件找那个没有此域名…

ffmpeg 提取mp4文件中的音频文件并保存

要从一个 MP4 文件中提取音频并保存为单独的音频文件&#xff0c;可以使用 ffmpeg 工具。以下是一个简单的命令示例&#xff1a; 命令格式 ffmpeg -i input.mp4 -vn -acodec copy output.mp3 参数解释 -i input.mp4: 指定输入文件为 input.mp4。 -vn: 禁用视频流&#xff0…