Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置


Posted in Javascript onMay 27, 2019

前提:

之前写过关于keep-Alive组件,来实现在列表页进入详情页后,后退,返回列表,显示上次访问的位置(原理就是缓存列表页数据来实现),目前发现另外一个问题,就是如果后台操作改变数据的状态,缓存的办法就会导致数据更新不及时导致一些页面错误(例如:商品疑问,在后台答复之后,不可以修改内容,前台更新不及时就会导致,前台显示可编辑,但实际状态是不可编辑了),所以又继续研究另外一种解决办法,scrollBehavior 来实现。

简介:

使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样。 vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动。

注意: 这个功能只在支持 history.pushState 的浏览器中可用。

官方文档简介: 滚动行为

使用方法:

const router = new VueRouter({
 routes: [...],
 scrollBehavior (to, from, savedPosition) {
 // return 期望滚动到哪个的位置
 }
})

或者集成模式写法:

utils.js

export function scrollBehavior (to, from, savedPosition) {
 // return 期望滚动到哪个的位置
}

index.js

import Vue from 'vue'
import Router from 'vue-router'
import { scrollBehavior } from './utils'
Vue.use(Router)
const router = new Router({
 mode: 'history',
 scrollBehavior,
 routes: [
 ...routesPC,
 ...routesMO
 ]
})
export default router

scrollBehavior 方法接收 to 和 from 路由对象。第三个参数 savedPosition 当且仅当 popstate 导航 (通过浏览器的 前进/后退 按钮触发) 时才可用。

在该方法内,可以通过判断路由to,from两个对象来做一些必要的判断;

savedPosition 参数是记录的上次滚动的位置;

通过return {x:number,y:number}来控制页面滚动的位置;

对于所有路由导航,简单地让页面滚动到顶部。

scrollBehavior (to, from, savedPosition) {
 return { x: 0, y: 0 }
}

想要在后退时,滚动到上次滚动的位置,如果满足条件,savedPosition有值的情况下:

scrollBehavior (to, from, savedPosition) {
 if (savedPosition) {
 return savedPosition
 } else {
 return { x: 0, y: 0 }
 }
}

新增情况:异步滚动

当页面数据需要请求加载有延迟的情况下,页面如果直接滚动,会出现滚动后,页面数据请求回来,DOM重新渲染,滚动失效的情况;

所以官方文档给补充了异步滚动的方法:

scrollBehavior (to, from, savedPosition) {
 return new Promise((resolve, reject) => {
  setTimeout(() => {
   resolve({ x: 0, y: 0 })
  }, 500)
 })
}

这个会在返回后,有一定延迟再滚动,可以根据自己项目的具体情况进行一定修改,兼容;

注:我的项目mobile端数据加载使用的是vue-mugen-scroll滑动加载数据组件,网上没找到能触发它加载的方法,所以,在返回列表页后,数据刷新,只有一页数据,滚动到底,也找不到上次的数据,呜呜呜......所以还是没有解决我的问题,但是这个方法是很好的,只是使用情况,会有限制,记录一下,以备后用。

总结

以上所述是小编给大家介绍的Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
Exjs 入门篇
Apr 07 Javascript
js猜数字小游戏的简单实现代码
Jul 02 Javascript
jQuery实现页面滚动时动态加载内容的方法
Mar 20 Javascript
javacript获取当前屏幕大小
Jun 04 Javascript
同步文本框内容JS代码实现
Aug 04 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
Aug 11 Javascript
Vue组件全局注册实现警告框的实例详解
Jun 11 Javascript
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
vue实现自定义H5视频播放器的方法步骤
Jul 01 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
Jun 24 Javascript
详解JavaScript作用域 闭包
Jul 29 Javascript
解决vue打包报错Unexpected token: punc的问题
Oct 24 Javascript
通过jQuery学习js类型判断的技巧
May 27 #jQuery
实现高性能javascript的注意事项
May 27 #Javascript
图解javascript作用域链
May 27 #Javascript
node.js命令行教程图文详解
May 27 #Javascript
详解JavaScript中的坐标和距离
May 27 #Javascript
优化Vue项目编译文件大小的方法步骤
May 27 #Javascript
了解JavaScript表单操作和表单域
May 27 #Javascript
You might like
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
jquery json 实例代码
2010/12/02 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
不间断循环滚动效果的实例代码(必看篇)
2016/10/08 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
如何编写一个d.ts文件的步骤详解
2018/04/13 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
你不知道的 TypeScript 高级类型(小结)
2020/08/28 Javascript
python3编码问题汇总
2016/09/06 Python
Python获取文件所在目录和文件名的方法
2017/01/12 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
python环形单链表的约瑟夫问题详解
2018/09/27 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
详解字符串在Python内部是如何省内存的
2020/02/03 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
2020/03/10 Python
Django设置Postgresql的操作
2020/05/14 Python
Python分类测试代码实例汇总
2020/07/23 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
如何完美的建立一个python项目
2020/10/09 Python
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
信访工作者先进事迹
2014/01/17 职场文书
餐饮营销方案
2014/02/23 职场文书
国际贸易实务实训报告
2014/11/05 职场文书
毕业生评语大全
2015/01/04 职场文书
送达通知书
2015/04/25 职场文书
干部理论学习心得体会
2016/01/21 职场文书
使用react-virtualized实现图片动态高度长列表的问题
2021/05/28 Javascript
原生JS实现飞机大战小游戏
2021/06/09 Javascript
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python