vue使用keep-alive保持滚动条位置的实现方法


Posted in Javascript onApril 09, 2019

前言

下班前,20分钟,发一篇。。。

简单介绍,使用keep-alive的时候,返回前一页,没有保持滚动条位置。

事实上,就算不使用keep-alive,位置也没有被记录。

但是,在不适用keep-alive的时候,页面内容会刷新,所以就随他去了……就是这么任性……

思路

官方有推荐一个scrollBehavior,链接,但是上面标注,只在history.pushState的浏览器生效,不知道是不是只能开启history.pushState才可以使用,看了下实现,挺不友好的,还是自己搞一个吧。。。

实现思路是这样的,首先给路由增加一个对象meta:

meta: {
  keepAlive: true,
  scrollTop: 0,
}

keepAlive是否需要保持页面,scrollTop记录页面的滚动位置。

然后在app.vue增加如下入口:

<keep-alive>
  <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>

这样就启用keep-alive了。

然后在全局main.ts增加一个全局路由控制:

router.beforeEach((to: Route, from: Route, next: () => void) => {  
  if (from.meta.keepAlive) {
  const $content = document.querySelector('#content');
  const scrollTop = $content ? $content.scrollTop : 0;
  from.meta.scrollTop = scrollTop;
 }
 next();
});

很简单,离开的时候判断当前页是否需要保持页面,如果需要,记录页面主容器content的滚动位置,写入路由。

然后,每次进入保持好的页面,读取滚动条位置scrollTop,修改主容器的scrollTop,就搞定了:

public activated() {
  const scrollTop = this.$route.meta.scrollTop;
  const $content = document.querySelector('#content');
  if (scrollTop && $content) {
   $content.scrollTop = scrollTop;
  }
}

看起来很简单哦。

遗留问题

1、是不是每个页面都可以记录滚动条位置呢?

其实不是的,有的页面,内部有js交互,比如tab交互,不同的tab,页面可滚动的高度不一致,如果不保持页面状态而统一记录滚动位置,有可能导致滚动条的位置错位。

2、能不能把activated这一步写到全局的main.ts或者state去呢?

有想过这点,但是目前来说,没找到实现的方法。

首先,如果通过router来控制,做不到,全局路由控制只能在页面加载前监听,取不到载入页的元素。

如果写在一个通用的全局函数去控制,比如定义一个state,当页面加载完的时候设置,那需要定义一个mixins来处理,但是对这个mixins不太熟悉,暂时还不知道该怎么做,可能有时间找个方法搞定它。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
VBScript版代码高亮
Jun 26 Javascript
javascript之锁定表格栏位
Jun 29 Javascript
js Flash插入函数免激活代码
Mar 31 Javascript
用js小类库获取浏览器的高度和宽度信息
Jan 15 Javascript
Eval and new funciton not the same thing
Dec 27 Javascript
js判断浏览器是否支持html5
Aug 17 Javascript
javascript删除元素节点removeChild()用法实例
May 26 Javascript
分享15个大家都熟知的jquery小技巧
Dec 02 Javascript
基于构造函数的五种继承方法小结
Jul 27 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
Sep 21 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
Apr 25 Javascript
在VUE中实现文件下载并判断状态的方法
Nov 08 Javascript
浅谈JavaScript闭包
Apr 09 #Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
Apr 09 #Javascript
webpack4实现不同的导出类型
Apr 09 #Javascript
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
Apr 09 #Javascript
基于three.js实现的3D粒子动效实例代码
Apr 09 #Javascript
Koa 中的错误处理解析
Apr 09 #Javascript
简单说说如何使用vue-router插件的方法
Apr 08 #Javascript
You might like
php实现下载限制速度示例分享
2014/02/13 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
PHP面向对象程序设计(OOP)之方法重写(override)操作示例
2018/12/21 PHP
jQuery UI-Draggable 参数集合
2010/01/10 Javascript
jquery validate使用攻略 第四步
2010/07/01 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
jQuery动画效果相关方法实例分析
2015/12/31 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
2019/08/26 Javascript
vue登录注册实例详解
2019/09/14 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
js实现扫雷源代码
2020/11/27 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
Python2.x与Python3.x的区别
2016/01/14 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
2018/05/30 Python
详解Python循环作用域与闭包
2019/03/21 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
python读取大文件越来越慢的原因与解决
2019/08/08 Python
Python爬虫:url中带字典列表参数的编码转换方法
2019/08/21 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
Tensorflow: 从checkpoint文件中读取tensor方式
2020/02/10 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
浅谈对python中if、elif、else的误解
2020/08/20 Python
如何用border-image实现文字气泡边框的示例代码
2020/01/21 HTML / CSS
你常见到的runtime exception
2016/09/05 面试题
医院门卫岗位职责
2013/12/30 职场文书
战友聚会邀请函
2014/01/18 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
法制宣传教育方案
2014/05/09 职场文书
2015年小学远程教育工作总结
2015/07/28 职场文书
canvas实现贪食蛇的实践
2022/02/15 Javascript