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 相关文章推荐
Google 静态地图API实现代码
Nov 19 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
Dec 12 Javascript
angularjs 处理多个异步请求方法汇总
Jan 06 Javascript
Javascript动画效果(3)
Oct 11 Javascript
Angular1.x复杂指令实例详解
Mar 01 Javascript
jQuery获取Table某列的值(推荐)
Mar 03 Javascript
Angular排序实例详解
Jun 28 Javascript
JS对象与json字符串相互转换实现方法示例
Jun 14 Javascript
深入理解 Koa 框架中间件原理
Oct 18 Javascript
说说如何利用 Node.js 代理解决跨域问题
Apr 22 Javascript
深入了解JS之作用域和闭包
Jun 16 Javascript
vue v-on:click传递动态参数的步骤
Sep 11 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中HTTP方式下的Gzip压缩传输方法举偶
2007/02/15 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
拥抱模块化的JavaScript
2012/03/07 Javascript
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
javascript 中that的含义示例介绍
2014/05/14 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
AngularJS基础学习笔记之指令
2015/05/10 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
2015/10/29 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
AngularJs 动态加载模块和依赖
2016/09/15 Javascript
layer弹出层框架alert与msg详解
2017/03/14 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
Vue.js自定义事件的表单输入组件方法
2018/03/08 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
2018/09/03 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
跟老齐学Python之让人欢喜让人忧的迭代
2014/10/02 Python
python搭建微信公众平台
2016/02/09 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
python中最小二乘法详细讲解
2021/02/19 Python
悬挂训练绳:TRX
2017/12/14 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
应届生简历中的自我评价
2014/01/13 职场文书
大学生开西餐厅创业计划书
2014/02/01 职场文书
大学生应聘求职信
2014/05/26 职场文书
党员民主评议个人总结
2014/10/20 职场文书
2015小学师德工作总结
2015/07/21 职场文书
Python如何将list中的string转换为int
2022/07/15 Ruby