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 backgroundImage控制
May 19 Javascript
一行代码告别document.getElementById
Jun 01 Javascript
邮箱下拉自动填充选择示例代码附图
Apr 03 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
Nov 21 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
Jan 14 Javascript
javascript实现可键盘控制的抽奖系统
Mar 10 Javascript
jquery html动态添加的元素绑定事件详解
May 24 Javascript
jQuery remove()过滤被删除的元素(推荐)
Jul 18 jQuery
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
Apr 22 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
May 07 Javascript
小程序中英文混合排序问题解决
Aug 02 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
Aug 10 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
phpmail类发送邮件函数代码
2012/02/20 PHP
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
innerHTML,outerHTML,innerTEXT三者之间的区别
2007/01/28 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
js 一个关于图片onload加载的事
2013/11/10 Javascript
js利用数组length属性清空和截短数组的小例子
2014/01/15 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
解决jquery无法找到其他父级子集问题的方法
2016/05/10 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
2017/03/30 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
angularJS开发注意事项
2018/05/26 Javascript
详解如何在微信小程序中愉快地使用sass
2018/07/30 Javascript
解决vue 子组件修改父组件传来的props值报错问题
2019/11/09 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
JavaScript实现简单贪吃蛇效果
2020/03/09 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
pyqt5 从本地选择图片 并显示在label上的实例
2019/06/13 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
泰国办公用品购物网站:OfficeMate
2018/02/04 全球购物
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
财务部出纳岗位职责
2013/12/22 职场文书
成品仓管员工作职责
2013/12/29 职场文书
医学类个人求职信范文
2014/02/05 职场文书
十佳护士先进事迹
2014/05/08 职场文书
大专生求职信
2014/06/29 职场文书
2014年个人师德工作总结
2014/12/04 职场文书
学会感恩主题班会
2015/08/12 职场文书
九年级历史教学反思
2016/02/19 职场文书