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 相关文章推荐
直接生成打开窗口代码,不必下载
May 14 Javascript
javascript loadScript异步加载脚本示例讲解
Nov 14 Javascript
对new functionName()定义一个函数的理解
May 22 Javascript
node.js中的http.response.write方法使用说明
Dec 14 Javascript
jQuery右下角旋转环状菜单特效代码
Aug 10 Javascript
jQuery可见性过滤选择器用法示例
Sep 09 Javascript
JavaScript实现256色转灰度图
Feb 22 Javascript
利用Node.js对文件进行重命名
Mar 12 Javascript
Angular2实现组件交互的方法分析
Dec 19 Javascript
解决vue 路由变化页面数据不刷新的问题
Mar 13 Javascript
Vue 权限控制的两种方法(路由验证)
Aug 16 Javascript
js实现旋转的星空效果
Nov 01 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
MayFish PHP的MVC架构的开发框架
2009/08/13 PHP
php使用websocket示例详解
2014/03/12 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
jquery中event对象属性与方法小结
2013/12/18 Javascript
window.open打开页面居中显示的示例代码
2013/12/27 Javascript
javascript设计模式之工厂模式示例讲解
2014/03/04 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
说说Vuex的getters属性的具体用法
2019/04/15 Javascript
Element Notification通知的实现示例
2020/07/27 Javascript
Python3基础之基本数据类型概述
2014/08/13 Python
python开发之字符串string操作方法实例详解
2015/11/12 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
python elasticsearch环境搭建详解
2019/09/02 Python
pandas 空数据处理方法详解
2019/11/02 Python
python通过链接抓取网站详解
2019/11/20 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
Python使用matplotlib绘制圆形代码实例
2020/05/27 Python
区分python中的进程与线程
2020/08/13 Python
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
业务员简历自我评价
2014/03/06 职场文书
意向书范文
2014/03/31 职场文书
应聘会计求职信
2014/06/11 职场文书
通知函的格式
2015/04/27 职场文书
总经理聘用协议书
2015/09/21 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
详解Vue的options
2021/05/15 Vue.js
Pytorch distributed 多卡并行载入模型操作
2021/06/05 Python