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实现上传图片前的预览(TX的面试题)
Aug 14 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
Apr 03 Javascript
javascript修改IMG标签的src问题
Mar 28 Javascript
jQuery解析XML文件同时动态增加js文件的方法
Jun 01 Javascript
web前端开发JQuery常用实例代码片段(50个)
Aug 28 Javascript
浅谈javascript的闭包
Jan 23 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
Aug 30 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
Mar 12 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
Apr 17 Javascript
Node.js爬虫如何获取天气和每日问候详解
Aug 26 Javascript
layui默认选中table的CheckBox复选框方法
Sep 19 Javascript
vue3.0中setup使用(两种用法)
Dec 02 Vue.js
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
php获取域名的google收录示例
2014/03/24 PHP
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
php数据访问之查询关键字
2016/05/09 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
Alliance vs Liquid BO3 第一场2.13
2021/03/10 DOTA
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
2014/05/05 Javascript
Jquery焦点与失去焦点示例应用
2014/06/10 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
angular或者js怎么确定选中ul中的哪几个li
2017/08/16 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
JavaScript实用代码小技巧
2018/08/23 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
python中assert用法实例分析
2015/04/30 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
详解Python3中ceil()函数用法
2019/02/19 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
详解用python写一个抽奖程序
2019/05/10 Python
Python3enumrate和range对比及示例详解
2019/07/13 Python
Python切图九宫格的实现方法
2019/10/10 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
plt.figure()参数使用详解及运行演示
2021/01/08 Python
深入浅出CSS3 background-clip,background-origin和border-image教程
2011/01/27 HTML / CSS
HTML5新特性 多线程(Worker SharedWorker)
2017/04/24 HTML / CSS
大学生就业推荐信范文
2013/11/29 职场文书
离职报告格式
2014/11/04 职场文书
立秋之描写立秋的作文(五年级)
2019/08/08 职场文书
利用Python实现Picgo图床工具
2021/11/23 Python