当前位置: 首页 > 知识库问答 >
问题:

前端 - vue加载最新的数据以及向上滚动加载历史更多数据?

梁季
2024-06-09

在聊天发送信息

data: {    return {        form: {          page: 0        },    }} /** 加载最新的数据以及向上滚动加载历史更多数据**/  async getChatDataOlds() {        this.isLoadingMore = true;        const res = await getChatDataOld(this.form.id, this.form.page)        if (res && res.length > 0) {          let list = res.reverse();          list = list.concat(this.messagescontent);          this.messagescontent = list;          this.form.page = this.messagescontent[0].id;          this.splitArrayByTimestampDiff(this.messagescontent);          // 加载新消息后稍微向下滚动一点            this.$nextTick(() => {            const scrollPositionBefore = this.$refs.messagesContainer.scrollTop;            const newScrollHeight = this.$refs.messagesContainer.scrollHeight;            let scrollToPosition = scrollPositionBefore + Math.min(400, newScrollHeight - scrollPositionBefore - this.$refs.messagesContainer.clientHeight);            if (scrollToPosition < newScrollHeight) {              this.$refs.messagesContainer.scrollTop = scrollToPosition;            }          });        } else {          this.hasMore = false;        }        this.isLoadingMore = false;      },/** 点击切换用户 **/handleBgColor(val, item) {  this.inputMessage = ""  this.leftList[val].unreadNumber = 0;  this.userName = item.trueName  this.highlightedIndex = val  this.form.userId = 'PC_' + item.userId  this.form.id = item.userReceiveId  this.form.chatType = item.chatType  this.form.page = 0  this.messagescontent = []  if (this.form.id) {    this.getChatDataOlds()  }},/** 向上滚动加载**/handleScroll() {  const scrollPosition = this.$refs.messagesContainer.scrollTop;  if (scrollPosition < 50 && this.hasMore && !this.isLoadingMore) {    // this.getChatDataOlds(this.form.id, this.form.page);    this.getChatDataOlds();  }},

this.form.id是对方的聊天用户id,this.form.page初始化为0,是拿到getChatDataOld最新的数据,在这些代码中向上加载拿到this.messagescontent[0].id下标第一次的id加载更多历史数据,现在遇到的问题是第一次点击切换用户,往上加载更多历史数据没有问题,当切换用户再切换回来,向上滚动不会再加载历史更多数据了,大佬们,怎么处理这个呢

共有1个答案

左丘子平
2024-06-09

问题出现在当你切换用户时,你重置了this.form.page为0,并且清空了this.messagescontent数组。当再次切换回同一个用户时,因为this.form.page是0,并且this.messagescontent是空的,程序认为没有更多历史数据需要加载,因此不再调用getChatDataOlds函数加载更多数据。

要解决这个问题,你需要保存每个用户的最后加载的page值。一种方法是在data中为每个用户维护一个page值,或者使用Vuex(如果你正在使用Vuex管理状态)或其他状态管理库来存储这个值。

以下是一个简化的例子,展示了如何在组件的data中为每个用户维护一个page值:

data() {  return {    form: {      userId: '',      id: '',      page: 0,      chatType: ''    },    messagescontent: [],    hasMore: true,    isLoadingMore: false,    userPages: {} // 用于存储每个用户的page值  };},methods: {  async getChatDataOlds() {    // ... 省略其他代码 ...    if (res && res.length > 0) {      // ... 省略其他代码 ...      // 更新用户的page值      this.userPages[this.form.id] = this.messagescontent[0].id;      // ... 省略其他代码 ...    }    // ... 省略其他代码 ...  },  handleBgColor(val, item) {    // ... 省略其他代码 ...    // 设置当前用户的page值为之前保存的page值(如果有的话)    this.form.page = this.userPages[item.userReceiveId] || 0;    // ... 省略其他代码 ...  },  // ... 省略其他方法 ...}

handleBgColor方法中,当你切换用户时,你检查this.userPages对象中是否有为这个用户保存的page值。如果有,就使用这个值作为新的this.form.page;如果没有,就使用默认值0。

这样,当你切换回之前的用户时,this.form.page会是你之前为该用户保存的page值,因此当向上滚动时,会正确地加载更多历史数据。

确保在适当的时候(比如组件销毁时)清理this.userPages对象,以避免内存泄漏。如果用户在多个会话或窗口中打开应用,并且你需要在这些会话间共享状态,你可能需要考虑使用本地存储(如localStorage)或其他持久化方法。

 类似资料:
  • 我只是想知道,只有在div.loading可见的情况下,如何才能在scroll上实现更多的数据。 通常我们寻找页面高度和滚动高度,看看我们是否需要加载更多的数据。但是下面的例子有点复杂。 下面的图片是完美的例子。下拉框上有两个。加载div。当用户滚动内容时,无论哪个可见,都应该开始为其加载更多数据。 因此,我如何才能找出是否加载div是可见的用户呢?所以我可以开始加载该div的数据。

  • 这是我的代码: 我想滚动我的卷轴,但不能,因为#refresh重新加载每3000。有人知道如何解决这个问题吗?

  • 本文向大家介绍vue2滚动条加载更多数据实现代码,包括了vue2滚动条加载更多数据实现代码的使用技巧和注意事项,需要的朋友参考一下 解析: 判断滚动条到底部,需要用到DOM的三个属性值,即scrollTop、clientHeight、scrollHeight。 scrollTop为滚动条在Y轴上的滚动距离。 clientHeight为内容可视区域的高度。 scrollHeight为内容可视区域的高

  • 问题内容: 我正在尝试检索具有ajax加载向下滚动功能alla Twitter的页面中的元素。由于某种原因,此功能无法正常运行。我添加了一些打印语句以对其进行调试,但我总是得到相同数量的项目,然后函数返回。我在这里做错了什么? 问题答案: 尝试介于两者之间 注意:硬睡眠只是为了证明它有效。请改用waits包来等待智能状态。

  • 问题内容: 我正在尝试检索具有ajax加载向下滚动功能alla Twitter的页面中的元素。由于某些原因,此功能无法正常运行。我添加了一些打印语句以对其进行调试,并且我总是得到相同数量的项目,然后函数返回。我在这里做错了什么? 问题答案: 尝试介于两者之间 注意:硬睡眠只是为了证明它有效。请改用waits包来等待智能状态。

  • 本文向大家介绍jquery滚动加载数据的方法,包括了jquery滚动加载数据的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jquery滚动加载数据的方法。分享给大家供大家参考。具体分析如下: 我们浏览有些网页的时候,当拉动浏览器的滚动条时到页底时,页面会继续自动加载更多内容供用户浏览。这种技术我暂且称它为滚屏加载技术,我们发现很多网站用到这种技术,例如新浪微博、QQ空间等。 代码如

  • 本文向大家介绍vue elementUI table表格数据 滚动懒加载的实现方法,包括了vue elementUI table表格数据 滚动懒加载的实现方法的使用技巧和注意事项,需要的朋友参考一下 在项目中遇到了一个性能问题 vue+elementUI table表格展示数据,当数据很多的时候,不能一页显示完,同时一次请求数据量太大,会增加网页渲染的时间,影响体验, 这个时候常常有两种方法处理,

  • 有没有办法将修订版直接添加到_AUD表中作为历史修订版? 据我所知,当实体被持久化时,envers会在_AUD表中创建修订记录,并将当前记录保留在实体表中。假设我想添加历史修订而不影响实体表,这可能吗? 例如,我有一个人实体 我想在PERSON_AUD中添加以下内容,而不修改PERSON表,因为SMITH是当前姓名。