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 简单抽屉效果的实现代码
Mar 09 Javascript
给页面渲染时间加速 干掉Dom Level 0 Event
Dec 19 Javascript
鼠标拖拽移动子窗体的JS实现
Feb 25 Javascript
使用jquery+CSS实现控制打印样式
Dec 31 Javascript
jQuery实现链接的title快速出现的方法
Feb 20 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
Mar 15 Javascript
Vue.js仿微信聊天窗口展示组件功能
Aug 11 Javascript
解析Angular 2+ 样式绑定方式
Jan 15 Javascript
分享5个好用的javascript文件上传插件
Sep 16 Javascript
vue.js实现回到顶部动画效果
Jul 31 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
Feb 06 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
Feb 23 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
PHP学习 变量使用总结
2011/03/24 PHP
Smarty foreach控制循环次数的实现详解
2013/07/03 PHP
php使用ob_start()实现图片存入变量的方法
2014/11/14 PHP
php使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
php编程中echo用逗号和用点号连接的区别
2016/03/26 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
Prototype使用指南之hash.js
2007/01/10 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
2011/06/28 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
一个基于jquery的文本框记数器
2012/09/19 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
2013/11/18 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
控制台报错object is not a function的解决方法
2014/08/24 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
用js写的一个路由(简单实例)
2016/09/24 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
12个非常有用的JavaScript技巧
2017/05/17 Javascript
用npm安装vue和vue-cli,并使用webpack创建项目的方法
2018/09/28 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
Python操控mysql批量插入数据的实现方法
2020/10/27 Python
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
优秀党员先进材料
2014/12/18 职场文书
单独二胎证明
2015/06/24 职场文书
员工试用期工作总结
2019/06/20 职场文书
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS