Vue记住滚动条和实现下拉加载的完美方法

 更新时间:2020年07月31日 08:38:27   作者:hezf  
这篇文章主要给大家介绍了关于Vue记住滚动条和实现下拉加载的完美方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

滚动条

常见于移动端 App 在滚动点击进入的时候

问题描述

当我们在开发 web app 的时候,经常会遇到一个问题,就是当从一个可滚动的列表页进入到下一个详情页面,然后返回列表页面的时候,很难去还原滚动条的状态,无法记住进来时候的位置。
以前我尝试过很多方法:

  1. 有 vue-router 自带的 scrollBehavior,需要记住 scrollTop,然后还原,但是管理这个 scrollTop 显得很麻烦,有的时候还不容易取值还有使用纯 CSS 的方式,在列表页面放置一个 router-view,详情页面利用 position 和 z-index 覆盖列表页面,返回后直接显示的就是原来的列表页面,这个必须把各层页面路由预先配置好,不然就会显示混乱了,并且同一个页面出现在不同的子路由下,需要配置多次,比如商品详情需要配置在很多个地方,造成冗余
  2. 以上解决方案都不理想

解决方案

后来我参考 keep-alive 开发了 vue-page-stack 来保存 Vue 页面的栈,即 Vue 中的虚拟 dom,但是滚动条的问题仍然没解决。因为虚拟 dom 没有记录各个组件的滚动状态,所以无法恢复。

在我使用 cube-ui 的时候发现,使用这个组件库里面的滚动容器,是可以还原出滚动条的,进一步发现是黄轶老师的 better-scroll 的原因。

通过查看 bs 的源码发现,原来是 bs 的内部实现不是原生滚动,而是记录一些滚动的信息,其中最重要的就是 x 和 y,也就是滚动的值,自己实现了一套滚动行为通过 transform 去实现,在还原虚拟 dom 的时候,滚动的信息也被还原了。

最终就是 vue-page-stack + bs 可以完美实现页面栈的还原

下拉加载

这个问题多见于消息记录等查询,在小程序中也会这遇到这样的问题

问题描述

绝大多数滚动场景都是上拉加载,上拉加载的时候,加载的内容在滚动区域的下方出现,加载之后,我们将数据添加到列表,由 Vue 等负责渲染新加载的内容,我们继续上拉就可以继续滚动查看。

但在我们的场景下,在某一会话中翻阅消息记录的时候,是下拉加载更多消息,加载后,继续下拉慢慢滚动查看。这就导致了一个很严重的问题:下拉加载后出现的内容在滚动区域的上方,不做任何处理的话加载后会直接跳到新加载内容的最上方,因为滚动距离没变,这就出问题了,和我们想实现的不一致。

解决方案

也想了很多的方法,包括计算新增加消息的总长度,然后滚回来,但是消息的类型和高度不一致,计算会有误差。
最终想到的处理办法就是:

  1. 通过接口获取到加载信息后首先标记(使用 shouldScroll 标记)后端返回的第一条信息,也就是加载后我们的视角要看到的新内容
  2. messageList 更新后,Vue 会更新数据和视图,这时候页面 dom 被更新了
  3. MessageItem 组件 mounted 后,这时候已经完成了视图的渲染,通过检查标记(shouldScroll),通知父容器滚动到刚才标记的位置,也就是加载的第一条信息处,这样也就把渲染和滚动做到一起了

以上两个问题在下图均有体现,效果还可以,如下:

以上内容在我的即时通讯应用客户端中均有体现,欢迎查看源码

总结

到此这篇关于Vue记住滚动条和实现下拉加载的完美方法的文章就介绍到这了,更多相关Vue滚动条和下拉加载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue3.0使用ref和reactive来创建响应式数据

    Vue3.0使用ref和reactive来创建响应式数据

    ref 和 reactive 是 Composition API 中用来创建响应式数据的两个核心函数,在本篇文章中,我们将详细讲解如何使用 ref 和 reactive 来创建响应式数据,并展示它们之间的区别和使用场景,需要的朋友可以参考下
    2024-11-11
  • defineProps宏函数不需要从vue中import导入的原因解析

    defineProps宏函数不需要从vue中import导入的原因解析

    这篇文章主要介绍了defineProps宏函数不需要从vue中import导入的原因解析,本文给大家介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • Vue 状态存储和会话存储同步清空问题解决方案(最新推荐)

    Vue 状态存储和会话存储同步清空问题解决方案(最新推荐)

    文章介绍了在使用Pinia定义的useHeaderTabStore中,tab状态通过会话存储初始化但未在退出登录时同步清空的问题,通过在PiniaStore中定义清空tab的函数,并在退出登录时调用该函数,可以确保状态和会话存储同步清空,避免内存中残留旧数据,感兴趣的朋友一起看看吧
    2024-12-12
  • vue.js开发实现全局调用的MessageBox组件实例代码

    vue.js开发实现全局调用的MessageBox组件实例代码

    最近学习了Vue.js,感觉组件这个地方知识点挺多的,而且很重要,所以决定记录下,下面这篇文章主要给大家介绍了关于利用vue.js开发实现全局调用的MessageBox组件的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-11-11
  • 谈谈vue中mixin的一点理解

    谈谈vue中mixin的一点理解

    vue中提供了一种混合机制--mixins,用来更高效的实现组件内容的复用。下面给大家谈谈我对vue中mixin的一点理解,需要的朋友参考下吧
    2017-12-12
  • uni-app在线预览pdf文件的方法教程

    uni-app在线预览pdf文件的方法教程

    这篇文章主要介绍了uni-app在线预览pdf文件的相关资料,本文主要介绍了如何在Vue项目中使用PDF.js插件进行PDF文件的预览,包括插件的下载、版本兼容问题的处理,以及在static文件夹下新建pdf文件夹存放解压文件,需要的朋友可以参考下
    2024-10-10
  • 基于Vue + ElementUI实现可编辑表格及校验

    基于Vue + ElementUI实现可编辑表格及校验

    这篇文章主要给大家介绍了基于Vue + ElementUI 实现可编辑表格及校验,文中有详细的代码讲解和实现思路,讲解的非常详细,有需要的朋友可以参考下
    2023-08-08
  • vue 对象添加或删除成员时无法实时更新的解决方法

    vue 对象添加或删除成员时无法实时更新的解决方法

    这篇文章主要介绍了vue 对象添加或删除成员时无法实时更新的解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • 基于Vue-cli的一套代码支持多个项目

    基于Vue-cli的一套代码支持多个项目

    这篇文章主要介绍了基于Vue-cli的一套代码支持多个项目的方案,帮助大家更好的理解和学习使用vue框架,感兴趣的朋友可以了解下
    2021-03-03
  • VUE利用vuex模拟实现新闻点赞功能实例

    VUE利用vuex模拟实现新闻点赞功能实例

    本篇文章主要介绍了VUE利用vuex模拟实现新闻点赞功能实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论