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 相关文章推荐
javascript类继承机制的原理分析
Sep 12 Javascript
js/jquery去掉空格,回车,换行示例代码
Nov 05 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
Nov 28 Javascript
用JavaScript实现类似于ListBox功能示例代码
Mar 09 Javascript
jQuery中[attribute*=value]选择器用法实例
Dec 31 Javascript
谈谈Vue.js——vue-resource全攻略
Jan 16 Javascript
bootstrap是什么_动力节点Java学院整理
Jul 14 Javascript
JavaScript 基础表单验证示例(纯Js实现)
Jul 20 Javascript
js实现登录与注册界面
Nov 01 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
Apr 10 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
Aug 03 Javascript
vue数据字典取键值项目的字典问题
Apr 12 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文件缓存内容保存格式实例分析
2014/08/20 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
PHP chop()函数讲解
2019/02/11 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
js中匿名函数的N种写法
2010/09/08 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
JavaScript获取当前页面上的指定对象示例代码
2014/02/28 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
Jquery调用iframe父页面中的元素及方法
2016/08/23 Javascript
vue.js学习笔记之绑定style样式和class列表
2016/10/31 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
jquery实现静态搜索功能(可输入搜索文字)
2017/03/28 jQuery
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
详解如何构建Promise队列实现异步函数顺序执行
2018/10/23 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
Python实现字典依据value排序
2016/02/24 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
Python采用Django制作简易的知乎日报API
2016/08/03 Python
python九九乘法表的实例
2017/09/26 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
使用coverage统计python web项目代码覆盖率的方法详解
2019/08/05 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
python 实现绘制整齐的表格
2019/11/18 Python
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
部队党性分析材料
2014/02/16 职场文书
不错的求职信范文
2014/07/20 职场文书
乡镇组织委员个人整改措施
2014/09/16 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python
利用Python实时获取steam特惠游戏数据
2022/06/25 Python