前提:以前写过关于keep-Alive组件,来实如今列表页进入详情页后,后退,返回列表,显示上次访问的位置(原理就是缓存列表页数据来实现),目前发现另一个问题,就是若是后台操做改变数据的状态,缓存的办法就会致使数据更新不及时致使一些页面错误(例如:商品疑问,在后台答复以后,不能够修改内容,前台更新不及时就会致使,前台显示可编辑,但实际状态是不可编辑了),因此又继续研究另一种解决办法,scrollBehavior 来实现。html
简介:使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像从新加载页面那样。 vue-router 能作到,并且更好,它让你能够自定义路由切换时页面如何滚动。前端
注意: 这个功能只在支持 history.pushState 的浏览器中可用。
官方文档简介:滚动行为vue
const router = new VueRouter({ routes: [...], scrollBehavior (to, from, savedPosition) { // return 指望滚动到哪一个的位置 } })
或者集成模式写法:vue-router
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}来控制页面滚动的位置;异步
对于全部路由导航,简单地让页面滚动到顶部。ide
scrollBehavior (to, from, savedPosition) { return { x: 0, y: 0 } }
想要在后退时,滚动到上次滚动的位置,若是知足条件,savedPosition有值的状况下:ui
scrollBehavior (to, from, savedPosition) { if (savedPosition) { return savedPosition } else { return { x: 0, y: 0 } } }
当页面数据须要请求加载有延迟的状况下,页面若是直接滚动,会出现滚动后,页面数据请求回来,DOM从新渲染,滚动失效的状况;
因此官方文档给补充了异步滚动的方法:code
scrollBehavior (to, from, savedPosition) { return new Promise((resolve, reject) => { setTimeout(() => { resolve({ x: 0, y: 0 }) }, 500) }) }
这个会在返回后,有必定延迟再滚动,能够根据本身项目的具体状况进行必定修改,兼容;
注:个人项目mobile端数据加载使用的是vue-mugen-scroll滑动加载数据组件,网上没找到能触发它加载的方法,因此,在返回列表页后,数据刷新,只有一页数据,滚动到底,也找不到上次的数据,呜呜呜......因此仍是没有解决个人问题,可是这个方法是很好的,只是使用状况,会有限制,记录一下,以备后用。