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 相关文章推荐
关于javascript function对象那些迷惑分析
Oct 24 Javascript
extjs tabpanel限制选项卡数量实现思路及代码
Apr 02 Javascript
jQuery之按钮组件的深入解析
Jun 19 Javascript
多引号嵌套的变量命名的问题
May 09 Javascript
浅析webapp框架AngularUI的demo
Dec 21 Javascript
jQuery实现Tab菜单滚动切换的方法
Sep 21 Javascript
JavaScript对象数组排序实例方法浅析
Jun 15 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
Dec 26 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
Jul 05 Javascript
使用node.js对音视频文件加密的实例代码
Aug 30 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
May 01 Javascript
ES6学习教程之Promise用法详解
Nov 22 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 swfupload图片上传的实例代码
2013/09/30 PHP
Laravel 的数据库迁移的方法
2017/07/31 PHP
PHP实现时间日期友好显示实现代码
2019/09/08 PHP
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
解析jquery中的ajax缓存问题
2013/12/19 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
js中settimeout方法加参数
2014/02/28 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
关于vue-resource报错450的解决方案
2017/07/24 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
2017/10/17 Javascript
JavaScript日期工具类DateUtils定义与用法示例
2018/09/03 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
2019/08/27 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
原生js实现文件上传、下载、封装等实例方法
2020/01/05 Javascript
jQuery实现数字华容道小游戏(实例代码)
2020/01/16 jQuery
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
2020/07/07 Javascript
特征脸(Eigenface)理论基础之PCA主成分分析法
2018/03/13 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
python制作抖音代码舞
2019/04/07 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
在python image 中安装中文字体的实现方法
2019/08/22 Python
Pytorch maxpool的ceil_mode用法
2020/02/18 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
Python 发送邮件方法总结
2020/08/10 Python
Django跨域请求原理及实现代码
2020/11/14 Python
html5 worker 实例(一) 为什么测试不到效果
2013/06/24 HTML / CSS
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
英国品牌男装折扣网站:Brown Bag
2018/03/08 全球购物
傲盾软件面试题
2015/08/17 面试题
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2012/04/17 面试题
询价采购方案
2014/06/09 职场文书
德劲DE1108畅想
2021/04/22 无线电