Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
前提:
之前写过关于keep-Alive组件,来实现在列表页进入详情页后,后退,返回列表,显示上次访问的位置(原理就是缓存列表页数据来实现),目前发现另外一个问题,就是如果后台操作改变数据的状态,缓存的办法就会导致数据更新不及时导致一些页面错误(例如:商品疑问,在后台答复之后,不可以修改内容,前台更新不及时就会导致,前台显示可编辑,但实际状态是不可编辑了),所以又继续研究另外一种解决办法,scrollBehavior来实现。
简介:
使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样。vue-router能做到,而且更好,它让你可以自定义路由切换时页面如何滚动。
注意:这个功能只在支持history.pushState的浏览器中可用。
官方文档简介:滚动行为
使用方法:
constrouter=newVueRouter({ routes:[...], scrollBehavior(to,from,savedPosition){ //return期望滚动到哪个的位置 } })
或者集成模式写法:
utils.js
exportfunctionscrollBehavior(to,from,savedPosition){ //return期望滚动到哪个的位置 }
index.js
importVuefrom'vue' importRouterfrom'vue-router' import{scrollBehavior}from'./utils' Vue.use(Router) constrouter=newRouter({ mode:'history', scrollBehavior, routes:[ ...routesPC, ...routesMO ] }) exportdefaultrouter
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){ returnsavedPosition }else{ return{x:0,y:0} } }
新增情况:异步滚动
当页面数据需要请求加载有延迟的情况下,页面如果直接滚动,会出现滚动后,页面数据请求回来,DOM重新渲染,滚动失效的情况;
所以官方文档给补充了异步滚动的方法:
scrollBehavior(to,from,savedPosition){ returnnewPromise((resolve,reject)=>{ setTimeout(()=>{ resolve({x:0,y:0}) },500) }) }
这个会在返回后,有一定延迟再滚动,可以根据自己项目的具体情况进行一定修改,兼容;
注:我的项目mobile端数据加载使用的是vue-mugen-scroll滑动加载数据组件,网上没找到能触发它加载的方法,所以,在返回列表页后,数据刷新,只有一页数据,滚动到底,也找不到上次的数据,呜呜呜......所以还是没有解决我的问题,但是这个方法是很好的,只是使用情况,会有限制,记录一下,以备后用。
总结
以上所述是小编给大家介绍的VuescrollBehavior滚动行为实现后退页面显示在上次浏览的位置,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!