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 相关文章推荐
JavaScript 继承详解(四)
Jul 13 Javascript
jQuery+css实现图片滚动效果(附源码)
Mar 18 Javascript
jquery实现的鼠标拖动排序Li或Table
May 04 Javascript
Javascript 读取操作Sql中的Xml字段
Oct 09 Javascript
JavaScript中的数据类型转换方法小结
Oct 26 Javascript
Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
Jul 14 Javascript
window.open打开窗口被拦截的快速解决方法
Aug 04 Javascript
javascript表达式和运算符详解
Feb 07 Javascript
Webpack devServer中的 proxy 实现跨域的解决
Jun 15 Javascript
JavaScript中构造函数与原型链之间的关系详解
Feb 25 Javascript
JavaScript中this用法学习笔记
Mar 17 Javascript
基于javascript canvas实现五子棋游戏
Jul 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类继承 extends使用介绍
2014/01/14 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
基于jquery的获取浏览器窗口大小的代码
2011/03/28 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
2015/06/15 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
jQuery Tree Multiselect使用详解
2017/05/02 jQuery
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
[原创]jquery判断元素内容是否为空的方法
2018/05/04 jQuery
react-native android状态栏的实现
2018/06/15 Javascript
vue实现移动端省市区选择
2019/09/27 Javascript
[55:48]VGJ.S vs TNC Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python 的 Socket 编程
2015/03/24 Python
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
python通过百度地图API获取某地址的经纬度详解
2018/01/28 Python
Python开发的十个小贴士和技巧及长常犯错误
2018/09/27 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
Python sep参数使用方法详解
2020/02/12 Python
如何在Python3中使用telnetlib模块连接网络设备
2020/09/21 Python
Python类的继承super相关原理解析
2020/10/22 Python
python xlsxwriter模块的使用
2020/12/24 Python
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
销售冠军获奖感言
2014/02/03 职场文书
创先争优承诺书范文
2014/03/31 职场文书
主题党日活动总结
2014/07/08 职场文书
集体生日活动方案
2014/08/18 职场文书
2014年教师节演讲稿
2014/09/03 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
三人合伙协议书范本
2014/10/29 职场文书
施工员岗位职责范本
2015/04/11 职场文书
学校清洁工岗位职责
2015/04/15 职场文书
MySQL分区路径子分区再分区
2022/04/13 MySQL