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 相关文章推荐
jQuery MD5加密实现代码
Mar 15 Javascript
再谈javascript图片预加载技术(详细演示)
Mar 12 Javascript
AngularJS语法详解
Jan 23 Javascript
js简单实现Select互换数据的方法
Aug 17 Javascript
Bootstrap carousel轮转图的使用实例详解
May 17 Javascript
js实现常用排序算法
Aug 09 Javascript
微信小程序分页加载的实例代码
Jul 11 Javascript
JavaScript监听手机物理返回键的两种解决方法
Aug 14 Javascript
JavaScript屏蔽Backspace键的实现代码
Nov 02 Javascript
jQuery实现的简单歌词滚动功能示例
Jan 07 jQuery
JavaScript类的继承多种实现方法
May 30 Javascript
vue项目实现分页效果
Mar 24 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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
php操作xml
2013/10/27 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
twig里使用js变量的方法
2016/02/05 PHP
PHP二维数组排序简单实现方法
2016/02/14 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
Django 中 cookie的使用
2017/08/17 PHP
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
JavaScript判断一个字符串是否包含指定子字符串的方法
2015/03/18 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
js实现分页功能
2017/05/24 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
Vue工程模板文件 webpack打包配置方法
2017/12/26 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
让 python 命令行也可以自动补全
2014/11/30 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
python django生成迁移文件的实例
2019/08/31 Python
Python MySQL 日期时间格式化作为参数的操作
2020/03/02 Python
python中的测试框架
2020/11/13 Python
next在python中返回迭代器的实例方法
2020/12/15 Python
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
2021/03/17 Javascript
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
大二自我鉴定范文
2013/10/05 职场文书
安全生产先进个人材料
2014/02/06 职场文书
幼儿园中班下学期评语
2014/04/18 职场文书
教师求职信
2014/06/17 职场文书
一年级数学上册复习计划
2015/01/17 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
《青山不老》教学反思
2016/02/22 职场文书
MySQL transaction事务安全示例讲解
2022/06/21 MySQL