vue-router如何在返回时返回到上次滚动位置 方法集锦

来源:互联网 发布:mac library文件夹在哪 编辑:程序博客网 时间:2024/06/06 00:19

方法一:

1.在router.js里面(即路由文件中),此时模式为 history

const router = new VueRouter({  mode: 'history',  routes,  scrollBehavior (to, from, savedPosition) {    if (savedPosition) {      return savedPosition    } else {      if (from.meta.keepAlive) {        from.meta.savedPosition = document.body.scrollTop      }      return { x: 0, y: to.meta.savedPosition || 0 }    }  }})
2.在router.js里面需要记录位置的单页面里面
let routes = [  {    path: '/',    name: 'home',    component: home,    meta: {      title: 'home',      keepAlive: true    }  }
3.App.vue里面<div id="app">  这样写的意义就是不缓存所有页面,哪个地方写了 keepAlive:true,哪个地方就记录位置(加缓存)

<keep-alive >      <router-view v-if="$route.meta.keepAlive"></router-view>  </keep-alive>  <router-view v-if="!$route.meta.keepAlive"></router-view>
4.位置确实记录上了(加缓存,返回不刷新页面),也就是说,返回不触发created,所以有些页面需要返回触发的东西都写在activated里面。其实整个过程很简单,代码也很干练,因为这是路由自带的功能,只不过之前没有发现罢了


方法二:

beforeRouteLeave(to, from, next){  let position = window.scrollY()  this.$store.commit('SAVE_POSITION', position) //离开路由时把位置存起来
  next()}
在页面中取值

updated () {  this.$nextTick(function(){    let position = this.$store.state.position //返回页面取出来    window.scroll(0, position)  }) }
用updated 或者 beforeUpdate 钩子都可以  代码都写在要保存滑动距离的界面

方法三:用默认的hash模式的

一个list页点击进入detail页,我在这时记录下list页滚动条的位置,然后在detail页返回到list页时设置滚动条位置为刚才保存那个值。

// list页route中的data钩子route : {    data : function () {        var _this = this;        // 返回同一个位置        var scrollTop = sessionStorage.getItem("scrollTop");        if (scrollTop) {            _this.$nextTick(function () {                    $(".abuild-record-layout").scrollTop(scrollTop);            });        }    }}

$nextTick将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上。


方法四:scrollBehavior方法

1.router文件中设置为 mode: 'history', 模式

2.router设置

scrollBehavior (to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    } else {
      return { x: 0, y: 0 }
    }
  }

3.详情页返回列表页时, 用 history.back() 返回





阅读全文
2 0
原创粉丝点击