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 prototype属性使用说明
May 13 Javascript
createElement与createDocumentFragment的点点区别小结
Dec 19 Javascript
Angularjs实现多个页面共享数据的方式
Mar 29 Javascript
AngularJS基础 ng-src 指令简单示例
Aug 03 Javascript
H5用户注册表单页 注册模态框!
Sep 17 Javascript
JavaScript 动态三角函数实例详解
Jan 08 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
Apr 16 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
Jun 26 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
Jul 17 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
Oct 20 Javascript
js+html获取系统当前时间
Nov 10 Javascript
原生实现一个react-redux的代码示例
Jun 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处理excel cvs表格的方法实例介绍
2013/05/13 PHP
解析php函数method_exists()与is_callable()的区别
2013/06/21 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
JavaScript 应用类库代码
2008/06/02 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
js密码强度校验
2015/11/10 Javascript
JavaScript类型系统之Object详解
2016/01/07 Javascript
基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用
2016/05/12 Javascript
基于bootstrap实现广告轮播带图片和文字效果
2016/07/22 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
Angular4实现动态添加删除表单输入框功能
2017/08/11 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
Seajs源码详解分析
2019/04/02 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
jQuery实现简单QQ聊天框
2020/08/27 jQuery
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
Python的爬虫包Beautiful Soup中用正则表达式来搜索
2016/01/20 Python
利用Python脚本生成sitemap.xml的实现方法
2017/01/31 Python
Django如何自定义model创建数据库索引的顺序
2019/06/20 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
python中wheel的用法整理
2020/06/15 Python
Python 列表反转显示的四种方法
2020/11/16 Python
CSS3圆角和渐变2种常用功能详解
2016/01/06 HTML / CSS
求职自荐信怎么写
2014/03/06 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
幼师求职自荐信
2015/03/26 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
亮剑观后感
2015/06/05 职场文书
高中物理教学反思
2016/02/19 职场文书
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android
nginx的zabbix 5.0安装部署的方法步骤
2021/07/16 Servers