当前位置: 首页 > Web前端 > HTML5

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

时间:2023-04-05 15:02:48 HTML5

前提:之前写过keep-Alive组件,实现列表页进入详情页后,返回,返回列表,并显示上次访问的位置(原理是缓存列表页面的数据来实现)。目前发现的另一个问题是,如果后台操作改变了数据的状态,缓存的方式会导致数据不能及时更新,导致一些页面错误(例如:产品问题,后台回复后,内容不能修改,如果前台没有及时更新,会导致前台显示可编辑,但实际状态不可编辑),所以继续研究另一种方案,scrollBehavior来实现。介绍:使用前端路由,当切换到新的路由时,希望页面滚动到顶部,或者保持原来的滚动位置,就像重新加载页面一样。vue-router可以做到,而且更好的是,它允许你自定义路由切换时页面如何滚动。注意:此功能仅在支持history.pushState的浏览器中可用。官方文档介绍:如何使用滚动行为:constrouter=newVueRouter({routes:[...],scrollBehavior(to,from,savedPosition){//返回预期的滚动位置}})或者集成模式写法:utils.jsexportfunctionscrollBehavior(to,from,savedPosition){//返回预期的滚动位置}index.jsimportVuefrom'vue'importRouterfrom'vue-router'import{scrollBehavior}from'./utils'Vue.use(Router)constrouter=newRouter({mode:'history',scrollBehavior,routes:[...routesPC,...routesMO]})exportdefaultrouterscrollBehavior方法接收到和来自路由对象。第三个参数savedPosition当且仅当popstate被导航(由浏览器的前进/后退按钮触发)时才可用。在这个方法中,可以通过判断routingto和from这两个对象来做一些必要的判断;savedPosition参数为记录的最后一次滚动位置;通过返回{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)})}这将在返回后一定延迟后滚动。大家可以根据自己项目的具体情况修改,兼容;注:我项目移动端数据加载使用的是vue-mugen-scroll滑动加载数据组件。我找不到触发其在Internet上加载的方法。于是,返回列表页后,刷新了数据,只有一页数据,scroll到最后,找不到最后一条数据了,呜呜呜。。。所以我的问题还是没有已经解决了,不过这个方法很好,只是用法而已,会有限制,记录下来以备后用。

猜你喜欢