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 相关文章推荐
Hutia 的 JS 代码集
Oct 24 Javascript
通过js动态操作table(新增,删除相关列信息)
May 23 Javascript
jquery判断小数点两位和自动删除小数两位后的数字
Mar 19 Javascript
谈一谈js中的执行环境及作用域
Mar 30 Javascript
JS简单实现浮动窗口效果示例
Sep 07 Javascript
Javascript中for循环语句的几种写法总结对比
Jan 23 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
Mar 09 Javascript
Vue项目中使用Vux的安装过程
May 01 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
Nov 04 Javascript
vue实现购物车案例
May 30 Javascript
微信小程序实现时间戳格式转换
Jul 20 Javascript
vue实现简单全选和反选功能
Sep 15 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
phpExcel中文帮助手册之常用功能指南
2014/08/18 PHP
Laravel 5 框架入门(三)
2015/04/09 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
jquery 入门教程 [翻译] 推荐
2009/08/17 Javascript
基于jquery的滚动鼠标放大缩小图片效果
2011/10/27 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
2016/08/15 Javascript
SelecT下拉框选中和取值的解决方法
2016/11/22 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
微信小程序实战之登录页面制作(5)
2020/03/30 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
强悍的Python读取大文件的解决方案
2019/02/16 Python
Python利用命名空间解析XML文档
2020/08/10 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
质检部岗位职责
2013/11/11 职场文书
运动会解说词50字
2014/01/18 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
公证处委托书
2015/01/28 职场文书
2015年销售工作总结范文
2015/03/30 职场文书
《黄道婆》教学反思
2016/02/22 职场文书
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
Python连续赋值需要注意的一些问题
2021/06/03 Python
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle