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 相关文章推荐
Extjs中ComboBoxTree实现的下拉框树效果(自写)
May 28 Javascript
Javascript实现可旋转的圆圈实例代码
Aug 04 Javascript
Bootstrap每天必学之栅格系统(布局)
Nov 25 Javascript
JavaScript中数组slice和splice的对比小结
Sep 22 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
Nov 10 Javascript
使用ionic切换页面卡顿的解决方法
Dec 16 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
Sep 16 Javascript
javascript浏览器用户代理检测脚本实现方法
Oct 27 Javascript
Vue2.0 http请求以及loading展示实例
Mar 06 Javascript
对layui中的onevent 和event的使用详解
Sep 06 Javascript
JavaScript实现图片合成下载的示例
Nov 19 Javascript
简单聊聊Vue中的计算属性和属性侦听
Oct 05 Vue.js
浅谈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 OPP机制和模式简介(抽象类、接口和契约式编程)
2014/06/09 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
基于jquery完美拖拽,可返回拖动轨迹
2012/03/29 Javascript
jQuery对象和Javascript对象之间转换的实例代码
2013/03/20 Javascript
js 自动播放的实例代码
2013/11/19 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
2015/09/04 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
2015/09/14 Javascript
JavaScript模块规范之AMD规范和CMD规范
2015/10/27 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
Node.js 回调函数实例详解
2017/07/06 Javascript
js断点调试心得分享(必看篇)
2017/12/08 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
JS数组的高级使用方法示例小结
2020/03/14 Javascript
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
详解Python Socket网络编程
2016/01/05 Python
Python3.6简单反射操作示例
2018/06/14 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
Kmeans均值聚类算法原理以及Python如何实现
2020/09/26 Python
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
西班牙家用电器和电子产品购物网站:Mi Electro
2019/02/25 全球购物
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
大学生两会精神学习心得体会
2014/03/10 职场文书
公开服务承诺制度
2014/03/26 职场文书
房屋出租委托书格式
2014/09/23 职场文书
思想纪律作风整顿剖析材料
2014/10/11 职场文书
2014年小班保育员工作总结
2014/12/23 职场文书