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 相关文章推荐
js apply/call/caller/callee/bind使用方法与区别分析
Oct 28 Javascript
dotopAlert 提示用户需安装播放器的代码
Sep 17 Javascript
js隐式全局变量造成的bug示例代码
Apr 22 Javascript
实现非常简单的js双向数据绑定
Nov 06 Javascript
JS实现图片高亮展示效果实例
Nov 24 Javascript
jQuery动态改变多行文本框高度的方法
Sep 07 Javascript
详解AngularJs中$resource和restfu服务端数据交互
Sep 21 Javascript
Angular5中调用第三方js插件的方法
Feb 26 Javascript
JavaScript图片处理与合成总结
Mar 04 Javascript
JS中appendChild追加子节点无效的解决方法
Oct 14 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
Feb 12 Javascript
vue单文件组件无法获取$refs的问题
Jun 24 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
德劲1103二次变频版的打磨
2021/03/02 无线电
Excel数据导入Mysql数据库的实现代码
2008/06/05 PHP
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
2017/11/28 PHP
jquery 事件执行检测代码
2009/12/09 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
JS仿hao123导航页面图片轮播效果
2016/09/01 Javascript
js实现一键复制功能
2017/03/16 Javascript
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
python中学习K-Means和图片压缩
2017/11/20 Python
浅析python3中的os.path.dirname(__file__)的使用
2018/08/30 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
Python中使用遍历在列表中添加字典遇到的坑
2019/02/27 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
python线程中的同步问题及解决方法
2019/08/29 Python
python安装scipy的步骤解析
2019/09/28 Python
使用css3绘制出各种几何图形
2016/08/17 HTML / CSS
Html5 audio标签样式的修改
2016/01/28 HTML / CSS
web字体加载方案优化小结
2019/11/29 HTML / CSS
广州品高软件.net笔面试题目
2012/04/18 面试题
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
优秀生推荐信范文
2013/11/28 职场文书
公务员政审单位鉴定材料
2014/05/16 职场文书
上党课的心得体会
2014/09/02 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
漂亮妈妈观后感
2015/06/08 职场文书
心术观后感
2015/06/11 职场文书
法院执行局工作总结
2015/08/11 职场文书
房屋转让协议书(标准范本)
2016/03/21 职场文书
2016个人廉洁自律承诺书
2016/03/25 职场文书
假如给我三天光明:舟逆水而行,人遇挫而达 
2019/10/29 职场文书
《鲁班学艺》读后感3篇
2019/11/27 职场文书
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle