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 相关文章推荐
基于jQuery的history历史记录插件
Dec 11 Javascript
JS 加入收藏夹的代码(主流浏览器通用)
May 13 Javascript
JS 删除字符串最后一个字符的实现代码
Feb 20 Javascript
LABjs、RequireJS、SeaJS的区别
Mar 04 Javascript
jQuery简单实现图片预加载
Apr 20 Javascript
javascript动态创建链接的方法
May 13 Javascript
深入探讨前端框架react
Dec 09 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
Feb 25 Javascript
jQuery中的ready函数与window.onload谁先执行
Jun 21 Javascript
简单实现Bootstrap标签页
Aug 09 Javascript
vue 下列表侧滑操作实例代码详解
Jul 24 Javascript
Vue可自定义tab组件用法实例
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
php多次include后导致全局变量global失效的解决方法
2015/02/28 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
PHP实现对数组分页处理实例详解
2017/02/07 PHP
js实现编辑div节点名称的方法
2014/12/17 Javascript
javascript感应鼠标图片透明度显示的方法
2015/02/24 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
JS实现动态修改table及合并单元格的方法示例
2017/02/20 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】
2017/12/05 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
jQuery实现模拟搜索引擎的智能提示功能简单示例
2019/01/27 jQuery
小程序中canvas的drawImage方法参数使用详解
2019/07/04 Javascript
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
js基于canvas实现时钟组件
2021/02/07 Javascript
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
web.py获取上传文件名的正确方法
2014/08/26 Python
Python进行数据科学工作的简单入门教程
2015/04/01 Python
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
Python字符编码与函数的基本使用方法
2017/09/30 Python
Python2/3中urllib库的一些常见用法
2017/12/19 Python
在dataframe两列日期相减并且得到具体的月数实例
2018/07/03 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
利用python画出AUC曲线的实例
2020/02/28 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
美国学校校服,儿童和婴儿服装:Cookie’s Kids
2016/10/14 全球购物
同学会主持词
2014/03/18 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
杭白菊导游词
2015/02/10 职场文书
二胎满月酒致辞
2015/07/29 职场文书
修改MySQL的默认密码的四种小方法
2021/05/26 MySQL
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫