首页 > web前端 > js教程 > 正文

如何在Vue中实现类似微信聊天记录的向上滚动加载功能而不让滚动条自动回到顶部?

心靈之曲
发布: 2025-03-18 08:32:01
原创
823人浏览过

如何在vue中实现类似微信聊天记录的向上滚动加载功能而不让滚动条自动回到顶部?

Vue.js实现微信式聊天记录向上滚动加载,滚动条位置不变

本文介绍如何在Vue.js中构建类似微信聊天记录的向上滚动加载功能,避免滚动条自动回滚到顶部。

现有代码已实现向上滚动加载更多记录,但新数据加载后,滚动条会回到顶部。为了解决这个问题,我们需要记录滚动位置,并在加载新数据后恢复该位置。

改进后的代码如下:

<template>
  <div id="app">
    <div class="container" ref="chatListRef" @scroll="handleScroll">
      <ul>
        <li v-for="item in msgs" :key="item">{{ item }}</li>
      </ul>
    </div>
  </div>
</template>

<script>
import { createApp, ref, nextTick } from 'https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-ms/vue/3.2.31/vue.esm-browser.prod.min.js';

function generateNumbers(start, end) {
  if (!Number.isInteger(start) || !Number.isInteger(end)) {
    throw new Error('Start and end must be integers.');
  }
  if (start > end) {
    throw new Error('Start must be less than or equal to end.');
  }
  return Array.from({ length: end - start + 1 }, (_, i) => start + i);
}

createApp({
  setup() {
    const msgs = ref(generateNumbers(1, 200));
    const chatListRef = ref(null);
    let prevScrollTop = 0; // 新增:记录之前的滚动条位置

    const scrollToBottom = async () => {
      const chatListElement = chatListRef.value;
      if (chatListElement) {
        chatListElement.scrollTop = chatListElement.scrollHeight;
      }
    };

    const handleScroll = (ev) => {
      const target = ev.target;
      prevScrollTop = target.scrollTop; // 新增:记录滚动条位置
      if (target.scrollTop === 0) {
        const scrollHeightBefore = target.scrollHeight;
        msgs.value.unshift(...generateNumbers(msgs.value.length + 1, msgs.value.length + 200));
        nextTick(() => {
          const scrollHeightAfter = target.scrollHeight;
          target.scrollTop = scrollHeightAfter - scrollHeightBefore + prevScrollTop; // 恢复滚动条位置
        });
      }
    };

    nextTick(() => scrollToBottom());

    return { msgs, chatListRef, handleScroll };
  },
}).mount('#app');
</script>

<style scoped>
* {
  margin: 0;
  padding: 0;
}
html,
body {
  height: 100vh;
  background-color: #e9f5f8;
}
.container {
  width: 200px;
  height: 500px;
  overflow-y: auto;
  background-color: #fff;
}
</style>
登录后复制

关键改进:

立即学习前端免费学习笔记(深入)”;

  1. 添加 prevScrollTop 变量记录之前的滚动条位置。
  2. 在 handleScroll 中,每次滚动时都更新 prevScrollTop。
  3. 加载新数据后,使用 nextTick 确保 DOM 更新完成,然后计算并设置新的 scrollTop 值,使其保持在加载数据前的相对位置。 target.scrollTop = scrollHeightAfter - scrollHeightBefore + prevScrollTop; 这行代码计算了需要调整的滚动距离,确保滚动条位置不变。

通过这些修改,实现了在向上滚动加载新数据时,滚动条位置保持不变的效果,提升用户体验。 代码也使用了更简洁的 Array.from 方法生成数字序列。

以上就是如何在Vue中实现类似微信聊天记录的向上滚动加载功能而不让滚动条自动回到顶部?的详细内容,更多请关注php中文网其它相关文章!

微信app下载
微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!

下载
相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号