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


Posted in Javascript onJuly 31, 2020

滚动条

常见于移动端 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记住滚动条和实现下拉加载的完美方法的文章就介绍到这了,更多相关Vue滚动条和下拉加载内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
May 03 Javascript
使用JavaScript实现连续滚动字幕效果的方法
Jul 07 Javascript
JavaScript实现cookie的写入、读取、删除功能
Nov 05 Javascript
javascript实现的登陆遮罩效果汇总
Nov 09 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
Nov 17 Javascript
Javascript字符串常用方法详解
Jul 21 Javascript
JavaScript递归操作实例浅析
Oct 31 Javascript
js调用屏幕宽度的简单方法
Nov 14 Javascript
Google 爬虫如何抓取 JavaScript 的内容
Apr 07 Javascript
node实现mock-plugin中间件的方法
Dec 25 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
Nov 05 Javascript
vue 获取url参数、get参数返回数组的操作
Nov 12 Javascript
vue中渲染对象中属性时显示未定义的解决
Jul 31 #Javascript
JS可断点续传文件上传实现代码解析
Jul 30 #Javascript
Vue单文件组件开发实现过程详解
Jul 30 #Javascript
vue实现从外部修改组件内部的变量的值
Jul 30 #Javascript
在vue中实现嵌套页面(iframe)
Jul 30 #Javascript
Vue文本模糊匹配功能如何实现
Jul 30 #Javascript
VUE 单页面使用 echart 窗口变化时的用法
Jul 30 #Javascript
You might like
第十四节 命名空间 [14]
2006/10/09 PHP
MySql中正则表达式的使用方法描述
2008/07/30 PHP
php下获取客户端ip地址的函数
2010/03/15 PHP
php中把美国时间转为北京时间的自定义函数分享
2014/07/28 PHP
Extjs单独定义各组件的实例代码
2013/06/25 Javascript
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
jquery.ajax之beforeSend方法使用介绍
2014/12/08 Javascript
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
2016/02/19 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
2017/01/04 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
2017/08/29 Javascript
jQuery实现form表单序列化转换为json对象功能示例
2018/05/23 jQuery
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
[00:37]DOTA2上海特级锦标赛 Secert 战队宣传片
2016/03/03 DOTA
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
Python装饰器原理与基本用法分析
2020/01/07 Python
K最近邻算法(KNN)---sklearn+python实现方式
2020/02/24 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
配件采购员岗位职责
2013/12/03 职场文书
推广普通话演讲稿
2014/05/23 职场文书
南湾猴岛导游词
2015/02/09 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
Python趣味挑战之用pygame实现简单的金币旋转效果
2021/05/31 Python
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers